diff options
author | wm4 <wm4@nowhere> | 2012-11-05 17:02:04 +0100 |
---|---|---|
committer | wm4 <wm4@nowhere> | 2012-11-12 20:06:14 +0100 |
commit | d4bdd0473d6f43132257c9fb3848d829755167a3 (patch) | |
tree | 8021c2f7da1841393c8c832105e20cd527826d6c /stream/stream_lavf.c | |
parent | bd48deba77bd5582c5829d6fe73a7d2571088aba (diff) | |
download | mpv-d4bdd0473d6f43132257c9fb3848d829755167a3.tar.bz2 mpv-d4bdd0473d6f43132257c9fb3848d829755167a3.tar.xz |
Rename directories, move files (step 1 of 2) (does not compile)
Tis drops the silly lib prefixes, and attempts to organize the tree in
a more logical way. Make the top-level directory less cluttered as
well.
Renames the following directories:
libaf -> audio/filter
libao2 -> audio/out
libvo -> video/out
libmpdemux -> demux
Split libmpcodecs:
vf* -> video/filter
vd*, dec_video.* -> video/decode
mp_image*, img_format*, ... -> video/
ad*, dec_audio.* -> audio/decode
libaf/format.* is moved to audio/ - this is similar to how mp_image.*
is located in video/.
Move most top-level .c/.h files to core. (talloc.c/.h is left on top-
level, because it's external.) Park some of the more annoying files
in compat/. Some of these are relicts from the time mplayer used
ffmpeg internals.
sub/ is not split, because it's too much of a mess (subtitle code is
mixed with OSD display and rendering).
Maybe the organization of core is not ideal: it mixes playback core
(like mplayer.c) and utility helpers (like bstr.c/h). Should the need
arise, the playback core will be moved somewhere else, while core
contains all helper and common code.
Diffstat (limited to 'stream/stream_lavf.c')
-rw-r--r-- | stream/stream_lavf.c | 170 |
1 files changed, 170 insertions, 0 deletions
diff --git a/stream/stream_lavf.c b/stream/stream_lavf.c new file mode 100644 index 0000000000..d62d9c9e57 --- /dev/null +++ b/stream/stream_lavf.c @@ -0,0 +1,170 @@ +/* + * This file is part of MPlayer. + * + * MPlayer is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * MPlayer is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with MPlayer; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "config.h" + +#include "libavformat/avformat.h" +#include "libavformat/avio.h" +#include "mp_msg.h" +#include "stream.h" +#include "m_option.h" +#include "m_struct.h" +#include "libmpdemux/demuxer.h" + +static int fill_buffer(stream_t *s, char *buffer, int max_len) +{ + AVIOContext *avio = s->priv; + int r = avio_read(avio, buffer, max_len); + return (r <= 0) ? -1 : r; +} + +static int write_buffer(stream_t *s, char *buffer, int len) +{ + AVIOContext *avio = s->priv; + avio_write(avio, buffer, len); + avio_flush(avio); + if (avio->error) + return -1; + return len; +} + +static int seek(stream_t *s, off_t newpos) +{ + AVIOContext *avio = s->priv; + s->pos = newpos; + if (avio_seek(avio, s->pos, SEEK_SET) < 0) { + s->eof = 1; + return 0; + } + return 1; +} + +static int control(stream_t *s, int cmd, void *arg) +{ + AVIOContext *avio = s->priv; + int64_t size, ts; + double pts; + switch(cmd) { + case STREAM_CTRL_GET_SIZE: + size = avio_size(avio); + if(size >= 0) { + *(off_t *)arg = size; + return 1; + } + break; + case STREAM_CTRL_SEEK_TO_TIME: + pts = *(double *)arg; + ts = pts * AV_TIME_BASE; + ts = avio_seek_time(avio, -1, ts, 0); + if (ts >= 0) + return 1; + break; + } + return STREAM_UNSUPPORTED; +} + +static void close_f(stream_t *stream) +{ + AVIOContext *avio = stream->priv; + /* NOTE: As of 2011 write streams must be manually flushed before close. + * Currently write_buffer() always flushes them after writing. + * avio_close() could return an error, but we have no way to return that + * with the current stream API. + */ + avio_close(avio); +} + +static const char * const prefix[] = { "lavf://", "ffmpeg://" }; + +static int open_f(stream_t *stream, int mode, void *opts, int *file_format) +{ + int flags = 0; + const char *filename; + AVIOContext *avio = NULL; + int res = STREAM_ERROR; + + if (mode == STREAM_READ) + flags = AVIO_FLAG_READ; + else if (mode == STREAM_WRITE) + flags = AVIO_FLAG_WRITE; + else { + mp_msg(MSGT_OPEN, MSGL_ERR, "[ffmpeg] Unknown open mode %d\n", mode); + res = STREAM_UNSUPPORTED; + goto out; + } + + if (stream->url) + filename = stream->url; + else { + mp_msg(MSGT_OPEN, MSGL_ERR, "[ffmpeg] No URL\n"); + goto out; + } + for (int i = 0; i < sizeof(prefix) / sizeof(prefix[0]); i++) + if (!strncmp(filename, prefix[i], strlen(prefix[i]))) + filename += strlen(prefix[i]); + if (!strncmp(filename, "rtsp:", 5)) { + /* This is handled as a special demuxer, without a separate + * stream layer. demux_lavf will do all the real work. + */ + stream->type = STREAMTYPE_STREAM; + stream->seek = NULL; + *file_format = DEMUXER_TYPE_LAVF; + stream->lavf_type = "rtsp"; + return STREAM_OK; + } + mp_msg(MSGT_OPEN, MSGL_V, "[ffmpeg] Opening %s\n", filename); + + if (avio_open(&avio, filename, flags) < 0) + goto out; + + char *rtmp[] = {"rtmp:", "rtmpt:", "rtmpe:", "rtmpte:", "rtmps:"}; + for (int i = 0; i < FF_ARRAY_ELEMS(rtmp); i++) + if (!strncmp(filename, rtmp[i], strlen(rtmp[i]))) { + *file_format = DEMUXER_TYPE_LAVF; + stream->lavf_type = "flv"; + } + stream->priv = avio; + int64_t size = avio_size(avio); + if (size >= 0) + stream->end_pos = size; + stream->type = STREAMTYPE_FILE; + stream->seek = seek; + if (!avio->seekable) { + stream->type = STREAMTYPE_STREAM; + stream->seek = NULL; + } + stream->fill_buffer = fill_buffer; + stream->write_buffer = write_buffer; + stream->control = control; + stream->close = close_f; + res = STREAM_OK; + +out: + return res; +} + +const stream_info_t stream_info_ffmpeg = { + "FFmpeg", + "ffmpeg", + "", + "", + open_f, + { "lavf", "ffmpeg", "rtmp", "rtsp", NULL }, + NULL, + 1 // Urls are an option string +}; |