Mercurial > mplayer.hg
changeset 12164:77ff303c0eaa
demux_lavf
author | michael |
---|---|
date | Sun, 11 Apr 2004 14:26:04 +0000 |
parents | 012b55951076 |
children | 6ae21c78ed8d |
files | Makefile configure libmpdemux/Makefile libmpdemux/demux_lavf.c libmpdemux/demuxer.c libmpdemux/demuxer.h |
diffstat | 6 files changed, 417 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/Makefile Fri Apr 09 22:58:41 2004 +0000 +++ b/Makefile Sun Apr 11 14:26:04 2004 +0000 @@ -39,7 +39,7 @@ CFLAGS = $(OPTFLAGS) -Ilibmpdemux -Iloader -Ilibvo $(FREETYPE_INC) $(EXTRA_INC) $(CDPARANOIA_INC) $(SDL_INC) $(X11_INC) $(FRIBIDI_INC) $(DVB_INC) $(XVID_INC) $(FONTCONFIG_INC) # -Wall -PARTS = libmpdemux libmpcodecs mp3lib liba52 libmpeg2 libavcodec libao2 drivers osdep postproc input libvo libaf +PARTS = libmpdemux libmpcodecs mp3lib liba52 libmpeg2 libavcodec libavformat libao2 drivers osdep postproc input libvo libaf ifeq ($(INTERNAL_FAAD),yes) COMMON_LIBS += libfaad2/libfaad2.a PARTS += libfaad2 @@ -140,6 +140,9 @@ libavcodec/libavcodec.a: $(MAKE) -C libavcodec LIBPREF=lib LIBSUF=.a +libavformat/libavformat.a: + $(MAKE) -C libavformat LIBPREF=lib LIBSUF=.a + libmpeg2/libmpeg2.a: $(MAKE) -C libmpeg2 @@ -304,6 +307,7 @@ -rm -f *.o *.a .depend configure.log codecs.conf.h @for a in $(PARTS); do $(MAKE) -C $$a distclean; done -$(MAKE) -C libavcodec distclean LIBPREF=lib LIBSUF=.a + -$(MAKE) -C libavformat distclean LIBPREF=lib LIBSUF=.a strip: strip -s $(ALL_PRG)
--- a/configure Fri Apr 09 22:58:41 2004 +0000 +++ b/configure Sun Apr 11 14:26:04 2004 +0000 @@ -199,6 +199,7 @@ --disable-divx4linux disable DivX4linux/Divx5linux codec [autodetect] --enable-opendivx enable _old_ OpenDivx codec [disable] --disable-libavcodec disable libavcodec [autodetect] + --disable-libavformat disable libavformat [autodetect] --enable-libfame enable libfame realtime encoder [autodetect] --enable-vorbis build with OggVorbis support [autodetect] --enable-tremor build with integer-only OggVorbis support [disabled] @@ -1133,6 +1134,7 @@ # If autodetection is available then the third state is: auto _libavcodec=auto _libavcodecso=auto +_libavformat=auto _fame=auto _mp1e=no _mencoder=yes @@ -1412,6 +1414,8 @@ --disable-opendivx) _opendivx=no ;; --enable-libavcodec) _libavcodec=yes ;; --disable-libavcodec) _libavcodec=no ;; + --enable-libavformat) _libavformat=yes;; + --disable-libavformat) _libavformat=no ;; --enable-libfame) _fame=yes ;; --disable-libfame) _fame=no ;; --enable-lirc) _lirc=yes ;; @@ -5029,6 +5033,20 @@ echores "$_libavcodec" fi +echocheck "FFmpeg libavformatc (static)" +if test "$_libavformat" = auto ; then + # Note: static linking is preferred to dynamic linking + _libavformat=no + if test -d libavformat && test -f libavformat/utils.c ; then + _libavformat=yes + echores "yes" + else + echores "no" + fi +else + echores "$_libavformat" +fi + _def_haveffpostprocess='no' if test -d libavcodec && test -f libavcodec/libpostproc/postprocess.h ; then _def_haveffpostprocess='yes' @@ -5076,6 +5094,13 @@ _nocodecmodules="libavcodec $_nocodecmodules" fi +_def_libavformat='#undef USE_LIBAVFORMAT' +if test "$_libavformat" = yes ; then + _def_libavformat='#define USE_LIBAVFORMAT 1' + _ld_libavformat='libavformat/libavformat.a' + _dep_libavformat='libavformat/libavformat.a' +fi + echocheck "libdv-0.9.5+" if test "$_libdv" = auto ; then _libdv=no @@ -5918,7 +5943,7 @@ HAVE_XVMC_ACCEL = $_xvmc # for libavcodec: -SRC_PATH=. +SRC_PATH=.. LIBPREF=lib LIBSUF=.a SLIBPREF=lib @@ -5961,8 +5986,9 @@ W32_LIB = $_ld_win32 DS_DEP = $_dep_dshow DS_LIB = $_ld_dshow -AV_DEP = $_dep_libavcodec -AV_LIB = $_ld_libavcodec +AV_DEP = $_dep_libavcodec $_dep_libavformat +AV_LIB = $_ld_libavcodec $_ld_libavformat +CONFIG_LIBAVFORMAT = $_libavformat ZORAN = $_zr FAME = $_fame FAME_LIB = $_ld_fame @@ -6268,6 +6294,9 @@ $_def_libavcodec $_def_libavcodecso +/* ffmpeg's libavformat support (requires libavformat source) */ +$_def_libavformat + /* risky codecs */ #define CONFIG_RISKY 1
--- a/libmpdemux/Makefile Fri Apr 09 22:58:41 2004 +0000 +++ b/libmpdemux/Makefile Sun Apr 11 14:26:04 2004 +0000 @@ -3,7 +3,7 @@ include ../config.mak -SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c demux_bmp.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c +SRCS = mp3_hdr.c video.c mpeg_hdr.c cache2.c asfheader.c aviheader.c aviprint.c muxer.c muxer_avi.c muxer_mpeg.c demux_asf.c demux_avi.c demux_mov.c parse_mp4.c demux_mpg.c demux_ty.c demux_ty_osd.c demux_pva.c demux_viv.c demuxer.c dvdnav_stream.c open.c parse_es.c stream.c stream_file.c stream_netstream.c stream_vcd.c stream_null.c stream_ftp.c tv.c tvi_dummy.c tvi_v4l.c tvi_v4l2.c tvi_bsdbt848.c frequencies.c demux_fli.c demux_real.c demux_y4m.c yuv4mpeg.c yuv4mpeg_ratio.c demux_nuv.c demux_film.c demux_roq.c mf.c demux_mf.c demux_audio.c demux_demuxers.c demux_ogg.c demux_bmp.c cdda.c demux_rawaudio.c demux_rawvideo.c cddb.c cdinfo.c demux_rawdv.c ai_alsa.c ai_alsa1x.c ai_oss.c audio_in.c demux_smjpeg.c demux_lmlm4.c cue_read.c extension.c demux_gif.c demux_ts.c demux_realaud.c url.c muxer_rawvideo.c demux_lavf.c ifeq ($(XMMS_PLUGINS),yes) SRCS += demux_xmms.c endif @@ -33,10 +33,13 @@ CPLUSPLUSSRCS += demux_mkv_old.cpp endif +ifeq ($(CONFIG_LIBAVFORMAT),yes) +LIBAV_INC = -I../libavcodec -I../libavformat +endif OBJS = $(SRCS:.c=.o) OBJS += $(CPLUSPLUSSRCS:.cpp=.o) -INCLUDE = -I../loader $(CSS_INC) $(EXTRA_INC) +INCLUDE = -I../loader $(CSS_INC) $(EXTRA_INC) $(LIBAV_INC) CFLAGS = $(OPTFLAGS) $(INCLUDE) $(XMMS_CFLAGS) $(CDPARANOIA_INC) $(DVB_INC) CPLUSPLUSFLAGS = $(CFLAGS) $(CPLUSPLUSINCLUDE) CPLUSPLUS = $(CC)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libmpdemux/demux_lavf.c Sun Apr 11 14:26:04 2004 +0000 @@ -0,0 +1,333 @@ +/* + Copyright (C) 2004 Michael Niedermayer <michaelni@gmx.at> + + This program 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. + + This program 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 this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +// #include <stdio.h> +#include <stdlib.h> +// #include <unistd.h> + +#include "config.h" +#include "mp_msg.h" +// #include "help_mp.h" + +#include "stream.h" +#include "demuxer.h" +#include "stheader.h" + +#ifdef USE_LIBAVFORMAT + +#include "avformat.h" +#include "avi.h" + +#define PROBE_BUF_SIZE 2048 +//#define IO_BUFFER_SIZE 32768 + +typedef struct lavf_priv_t{ + AVInputFormat *avif; + AVFormatContext *avfc; + ByteIOContext pb; + int audio_streams; + int video_streams; +}lavf_priv_t; + +extern void print_wave_header(WAVEFORMATEX *h); +extern void print_video_header(BITMAPINFOHEADER *h); + +static int mp_open(URLContext *h, const char *filename, int flags){ + return 0; +} + +static int mp_read(URLContext *h, unsigned char *buf, int size){ + stream_t *stream = (stream_t*)h->priv_data; + if(stream_eof(stream)) //needed? + return -1; + return stream_read(stream, buf, size); +} + +static int mp_write(URLContext *h, unsigned char *buf, int size){ + return -1; +} + +static offset_t mp_seek(URLContext *h, offset_t pos, int whence){ + stream_t *stream = (stream_t*)h->priv_data; +mp_msg(MSGT_HEADER,MSGL_DBG2,"file_seek(%p, %d, %d)\n", h, (int)pos, whence); + if(whence == SEEK_CUR) + pos +=stream_tell(stream); + else if(whence == SEEK_END) + pos += stream->end_pos; + else if(whence != SEEK_SET) + return -1; + + if(stream_seek(stream, pos)==0) + return -1; + return pos; +} + +static int mp_close(URLContext *h){ + return 0; +} + +static URLProtocol mp_protocol = { + "mp", + mp_open, + mp_read, + mp_write, + mp_seek, + mp_close, +}; + +int lavf_check_file(demuxer_t *demuxer){ + AVProbeData avpd; + uint8_t buf[PROBE_BUF_SIZE]; + lavf_priv_t *priv; + + if(!demuxer->priv) + demuxer->priv=calloc(sizeof(lavf_priv_t),1); + priv= demuxer->priv; + + av_register_all(); + + stream_read(demuxer->stream, buf, PROBE_BUF_SIZE); + avpd.filename= demuxer->stream->url; + avpd.buf= buf; + avpd.buf_size= PROBE_BUF_SIZE; + + priv->avif= av_probe_input_format(&avpd, 1); + if(!priv->avif){ + mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: no clue about this gibberish!\n"); + return 0; + }else + mp_msg(MSGT_HEADER,MSGL_V,"LAVF_check: %s\n", priv->avif->long_name); + + return 1; +} + +int demux_open_lavf(demuxer_t *demuxer){ + AVFormatContext *avfc; + AVFormatParameters ap; + lavf_priv_t *priv= demuxer->priv; + int i; + char mp_filename[256]="mp:"; + + memset(&ap, 0, sizeof(AVFormatParameters)); + + stream_seek(demuxer->stream, 0); + + register_protocol(&mp_protocol); + + strncpy(mp_filename + 3, demuxer->stream->url, sizeof(mp_filename)-3); + + url_fopen(&priv->pb, mp_filename, URL_RDONLY); + + ((URLContext*)(priv->pb.opaque))->priv_data= demuxer->stream; + + if(av_open_input_stream(&avfc, &priv->pb, mp_filename, priv->avif, &ap)<0){ + mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_open_input_stream() failed\n"); + return 0; + } + + priv->avfc= avfc; + + if(av_find_stream_info(avfc) < 0){ + mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF_header: av_find_stream_info() failed\n"); + return 0; + } + +//demux_info_add(demuxer, "author", string); ... + + for(i=0; i<avfc->nb_streams; i++){ + AVStream *st= avfc->streams[i]; + AVCodecContext *codec= &st->codec; + + switch(codec->codec_type){ + case CODEC_TYPE_AUDIO:{ + WAVEFORMATEX *wf= calloc(sizeof(WAVEFORMATEX) + codec->extradata_size, 1); + sh_audio_t* sh_audio=new_sh_audio(demuxer, i); + priv->audio_streams++; + if(!codec->codec_tag) + codec->codec_tag= codec_get_wav_tag(codec->codec_id); + wf->wFormatTag= codec->codec_tag; + wf->nChannels= codec->channels; + wf->nSamplesPerSec= codec->sample_rate; + wf->nAvgBytesPerSec= codec->bit_rate/8; + wf->nBlockAlign= codec->block_align; + wf->wBitsPerSample= codec->bits_per_sample; + wf->cbSize= codec->extradata_size; + if(codec->extradata_size){ + memcpy( + wf + 1, + codec->extradata, + codec->extradata_size); + } + sh_audio->wf= wf; + sh_audio->ds= demuxer->audio; + sh_audio->format= codec->codec_tag; + sh_audio->channels= codec->channels; + sh_audio->samplerate= codec->sample_rate; + if(verbose>=1) print_wave_header(sh_audio->wf); + demuxer->audio->id=i; + demuxer->audio->sh= demuxer->a_streams[i]; + break;} + case CODEC_TYPE_VIDEO:{ + BITMAPINFOHEADER *bih=calloc(sizeof(BITMAPINFOHEADER) + codec->extradata_size,1); + sh_video_t* sh_video=new_sh_video(demuxer, i); + + priv->video_streams++; + if(!codec->codec_tag) + codec->codec_tag= codec_get_bmp_tag(codec->codec_id); + bih->biSize= sizeof(BITMAPINFOHEADER) + codec->extradata_size; + bih->biWidth= codec->width; + bih->biHeight= codec->height; + bih->biBitCount= codec->bits_per_sample; + bih->biSizeImage = bih->biWidth * bih->biHeight * bih->biBitCount/8; + bih->biCompression= codec->codec_tag; + sh_video->bih= bih; + sh_video->disp_w= codec->width; + sh_video->disp_h= codec->height; + sh_video->video.dwRate= codec->frame_rate; + sh_video->video.dwScale= codec->frame_rate_base; + sh_video->fps=(float)sh_video->video.dwRate/(float)sh_video->video.dwScale; + sh_video->frametime=(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; + sh_video->format = bih->biCompression; + sh_video->ds= demuxer->video; + if(codec->extradata_size) + memcpy(sh_video->bih + 1, codec->extradata, codec->extradata_size); + if(verbose>=1) print_video_header(sh_video->bih); +/* short biPlanes; + int biXPelsPerMeter; + int biYPelsPerMeter; + int biClrUsed; + int biClrImportant;*/ + demuxer->video->id=i; + demuxer->video->sh= demuxer->v_streams[i]; + break;} + } + } + + mp_msg(MSGT_HEADER,MSGL_V,"LAVF: %d audio and %d video streams found\n",priv->audio_streams,priv->video_streams); + if(!priv->audio_streams) demuxer->audio->id=-2; // nosound +// else if(best_audio > 0 && demuxer->audio->id == -1) demuxer->audio->id=best_audio; + if(!priv->video_streams){ + if(!priv->audio_streams){ + mp_msg(MSGT_HEADER,MSGL_ERR,"LAVF: no audio or video headers found - broken file?\n"); + return 0; + } + demuxer->video->id=-2; // audio-only + } //else if (best_video > 0 && demuxer->video->id == -1) demuxer->video->id = best_video; + + return 1; +} + +int demux_lavf_fill_buffer(demuxer_t *demux){ + lavf_priv_t *priv= demux->priv; + AVPacket pkt; + demux_packet_t *dp; + demux_stream_t *ds; + int id; + mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_lavf_fill_buffer()\n"); + + demux->filepos=stream_tell(demux->stream); + + if(stream_eof(demux->stream)){ +// demuxre->stream->eof=1; + return 0; + } + + if(av_read_frame(priv->avfc, &pkt) < 0) + return 0; + + id= pkt.stream_index; + + if(id==demux->audio->id){ + // audio + ds=demux->audio; + if(!ds->sh){ + ds->sh=demux->a_streams[id]; + mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF audio ID = %d\n",ds->id); + } + } else if(id==demux->video->id){ + // video + ds=demux->video; + if(!ds->sh){ + ds->sh=demux->v_streams[id]; + mp_msg(MSGT_DEMUX,MSGL_V,"Auto-selected LAVF video ID = %d\n",ds->id); + } + } else + ds= NULL; + + if(0/*pkt.destruct == av_destruct_packet*/){ + //ok kids, dont try this at home :) + dp=(demux_packet_t*)malloc(sizeof(demux_packet_t)); + dp->len=pkt.size; + dp->next=NULL; + dp->refcount=1; + dp->master=NULL; + dp->buffer=pkt.data; + pkt.destruct= NULL; + }else{ + dp=new_demux_packet(pkt.size); + memcpy(dp->buffer, pkt.data, pkt.size); + av_free_packet(&pkt); + } + + dp->pts=pkt.pts / (float)AV_TIME_BASE; + dp->pos=demux->filepos; + dp->flags= !!(pkt.flags&PKT_FLAG_KEY); + // append packet to DS stream: + ds_add_packet(ds,dp); + return 1; +} + +void demux_seek_lavf(demuxer_t *demuxer, float rel_seek_secs, int flags){ + mp_msg(MSGT_DEMUX,MSGL_DBG2,"demux_seek_lavf()\n"); +} + +int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg) +{ + lavf_priv_t *priv = demuxer->priv; + + switch (cmd) { +/* case DEMUXER_CTRL_GET_TIME_LENGTH: + if (priv->duration == 0) + return DEMUXER_CTRL_DONTKNOW; + + *((unsigned long *)arg) = priv->duration; + return DEMUXER_CTRL_OK; + + case DEMUXER_CTRL_GET_PERCENT_POS: + if (priv->duration == 0) + return DEMUXER_CTRL_DONTKNOW; + + *((int *)arg) = (int)(100 * lastpts / priv->duration); + return DEMUXER_CTRL_OK;*/ + + default: + return DEMUXER_CTRL_NOTIMPL; + } +} + +void demux_close_lavf(demuxer_t *demuxer) +{ + lavf_priv_t* priv = demuxer->priv; + + if (priv){ + av_close_input_file(priv->avfc); priv->avfc= NULL; + free(priv); demuxer->priv= NULL; + } +} + +#endif // USE_LIBAVFORMAT
--- a/libmpdemux/demuxer.c Fri Apr 09 22:58:41 2004 +0000 +++ b/libmpdemux/demuxer.c Sun Apr 11 14:26:04 2004 +0000 @@ -139,6 +139,7 @@ extern void demux_close_mkv(demuxer_t* demuxer); extern void demux_close_ra(demuxer_t* demuxer); extern void demux_close_ty(demuxer_t* demuxer); +extern void demux_close_lavf(demuxer_t* demuxer); #ifdef USE_TV @@ -223,7 +224,10 @@ demux_close_ts(demuxer); break; case DEMUXER_TYPE_REALAUDIO: demux_close_ra(demuxer); break; - +#ifdef USE_LIBAVFORMAT + case DEMUXER_TYPE_LAVF: + demux_close_lavf(demuxer); break; +#endif } // free streams: for(i=0;i<256;i++){ @@ -313,6 +317,7 @@ extern int demux_smjpeg_fill_buffer(demuxer_t* demux); extern int demux_lmlm4_fill_buffer(demuxer_t* demux); extern int demux_mkv_fill_buffer(demuxer_t *d); +extern int demux_lavf_fill_buffer(demuxer_t *d); int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){ // Note: parameter 'ds' can be NULL! @@ -369,6 +374,9 @@ case DEMUXER_TYPE_MPEG4_IN_TS: return demux_ts_fill_buffer(demux); case DEMUXER_TYPE_REALAUDIO: return demux_ra_fill_buffer(demux); +#ifdef USE_LIBAVFORMAT + case DEMUXER_TYPE_LAVF: return demux_lavf_fill_buffer(demux); +#endif } return 0; } @@ -612,6 +620,8 @@ #ifdef HAVE_MATROSKA extern int demux_mkv_open(demuxer_t *demuxer); #endif +extern int lavf_check_file(demuxer_t *demuxer); +extern int demux_open_lavf(demuxer_t* demuxer); extern demuxer_t* init_avi_with_ogg(demuxer_t* demuxer); @@ -1078,6 +1088,19 @@ if(file_format==DEMUXER_TYPE_RTP) { demuxer=new_demuxer(stream,DEMUXER_TYPE_RTP,audio_id,video_id,dvdsub_id); } +//=============== Try to open with LAVF: ================= +#ifdef USE_LIBAVFORMAT + if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_LAVF){ + demuxer=new_demuxer(stream,DEMUXER_TYPE_LAVF,audio_id,video_id,dvdsub_id); + if(lavf_check_file(demuxer)){ + mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"libavformat"); //FIXME print format + file_format=DEMUXER_TYPE_LAVF; + } else { + free_demuxer(demuxer); + demuxer = NULL; + } +} +#endif //=============== Unknown, exiting... =========================== if(file_format==DEMUXER_TYPE_UNKNOWN || demuxer == NULL){ //mp_msg(MSGT_DEMUXER,MSGL_ERR,MSGTR_FormatNotRecognized); // will be done by mplayer.c after fallback to playlist-parsing @@ -1311,6 +1334,12 @@ if (!demux_open_ra(demuxer)) return NULL; break; } +#ifdef USE_LIBAVFORMAT + case DEMUXER_TYPE_LAVF: { + if (!demux_open_lavf(demuxer)) return NULL; + break; + } +#endif } // switch(file_format) pts_from_bps=0; // !!! return demuxer; @@ -1397,6 +1426,7 @@ int demux_seek_real(demuxer_t *demuxer,float rel_seek_secs,int flags); int demux_seek_pva(demuxer_t *demuxer,float rel_seek_secs,int flags); int demux_seek_ts(demuxer_t *demuxer,float rel_seek_secs,int flags); +int demux_seek_lavf(demuxer_t *demuxer,float rel_seek_secs,int flags); #ifdef HAVE_LIBDV095 int demux_seek_rawdv(demuxer_t *demuxer, float pts, int flags); @@ -1508,6 +1538,10 @@ case DEMUXER_TYPE_MPEG_TS: case DEMUXER_TYPE_MPEG4_IN_TS: demux_seek_ts(demuxer,rel_seek_secs,flags); break; + #ifdef USE_LIBAVFORMAT + case DEMUXER_TYPE_LAVF: + demux_seek_lavf(demuxer,rel_seek_secs,flags); break; + #endif } // switch(demuxer->file_format) @@ -1573,6 +1607,7 @@ extern int demux_audio_control(demuxer_t *demuxer, int cmd, void *arg); extern int demux_ogg_control(demuxer_t *demuxer, int cmd, void *arg); extern int demux_real_control(demuxer_t *demuxer, int cmd, void *arg); +extern int demux_lavf_control(demuxer_t *demuxer, int cmd, void *arg); int demux_control(demuxer_t *demuxer, int cmd, void *arg) { switch(demuxer->type) { @@ -1606,6 +1641,10 @@ #endif case DEMUXER_TYPE_REAL: return demux_real_control(demuxer, cmd, arg); +#ifdef USE_LIBAVFORMAT + case DEMUXER_TYPE_LAVF: + return demux_lavf_control(demuxer, cmd, arg); +#endif default: return DEMUXER_CTRL_NOTIMPL;
--- a/libmpdemux/demuxer.h Fri Apr 09 22:58:41 2004 +0000 +++ b/libmpdemux/demuxer.h Sun Apr 11 14:26:04 2004 +0000 @@ -43,11 +43,12 @@ #define DEMUXER_TYPE_REALAUDIO 32 #define DEMUXER_TYPE_MPEG_TY 33 #define DEMUXER_TYPE_LMLM4 34 +#define DEMUXER_TYPE_LAVF 35 // This should always match the higest demuxer type number. // Unless you want to disallow users to force the demuxer to some types #define DEMUXER_TYPE_MIN 0 -#define DEMUXER_TYPE_MAX 34 +#define DEMUXER_TYPE_MAX 35 #define DEMUXER_TYPE_DEMUXERS (1<<16) // A virtual demuxer type for the network code