diff options
Diffstat (limited to 'libmpdemux')
-rw-r--r-- | libmpdemux/aviheader.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_avi.c | 7 | ||||
-rw-r--r-- | libmpdemux/demux_lavf.c | 7 | ||||
-rw-r--r-- | libmpdemux/demux_mkv.c | 67 | ||||
-rw-r--r-- | libmpdemux/demux_mov.c | 3 | ||||
-rw-r--r-- | libmpdemux/demux_nemesi.c | 2 | ||||
-rw-r--r-- | libmpdemux/demux_ogg.c | 7 | ||||
-rw-r--r-- | libmpdemux/demux_rtp.cpp | 3 | ||||
-rw-r--r-- | libmpdemux/demuxer.c | 1789 | ||||
-rw-r--r-- | libmpdemux/demuxer.h | 55 | ||||
-rw-r--r-- | libmpdemux/parse_mp4.c | 2 | ||||
-rw-r--r-- | libmpdemux/stheader.h | 31 |
12 files changed, 1059 insertions, 916 deletions
diff --git a/libmpdemux/aviheader.c b/libmpdemux/aviheader.c index 85a84e8ca3..fa7f27c4fc 100644 --- a/libmpdemux/aviheader.c +++ b/libmpdemux/aviheader.c @@ -42,7 +42,7 @@ static int odml_get_vstream_id(int id, unsigned char res[]) return 0; } -int avi_idx_cmp(const void *elem1,const void *elem2) { +static int avi_idx_cmp(const void *elem1,const void *elem2) { register off_t a = AVI_IDX_OFFSET((AVIINDEXENTRY *)elem1); register off_t b = AVI_IDX_OFFSET((AVIINDEXENTRY *)elem2); return (a > b) - (b > a); diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c index afd20d6e02..345e67b4a0 100644 --- a/libmpdemux/demux_avi.c +++ b/libmpdemux/demux_avi.c @@ -24,7 +24,9 @@ extern const demuxer_desc_t demuxer_desc_avi_nini; int pts_from_bps=1; // Select ds from ID -demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id){ +static demux_stream_t* demux_avi_select_stream(demuxer_t *demux, + unsigned int id) +{ int stream_id=avi_stream_id(id); @@ -822,6 +824,7 @@ static int avi_check_file(demuxer_t *demuxer) static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer) { + struct MPOpts *opts = demuxer->opts; sh_audio_t* sh_a; demuxer = demux_open_avi(demuxer); @@ -836,7 +839,7 @@ static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer) stream_t* s; demuxer_t *od; s = new_ds_stream(demuxer->audio); - od = new_demuxer(s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL); + od = new_demuxer(opts, s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL); if(!demux_ogg_open(od)) { mp_msg( MSGT_DEMUXER,MSGL_ERR,MSGTR_ErrorOpeningOGGDemuxer); free_stream(s); diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c index 942a80fc56..79b71a1b9b 100644 --- a/libmpdemux/demux_lavf.c +++ b/libmpdemux/demux_lavf.c @@ -22,6 +22,7 @@ #include <limits.h> #include "config.h" +#include "options.h" #include "mp_msg.h" #include "help_mp.h" @@ -41,9 +42,6 @@ #define PROBE_BUF_SIZE 2048 -extern char *audio_lang; -extern char *dvdsub_lang; -extern int dvdsub_id; static unsigned int opt_probesize = 0; static unsigned int opt_analyzeduration = 0; static char *opt_format; @@ -405,6 +403,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i) { } static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ + struct MPOpts *opts = demuxer->opts; AVFormatContext *avfc; AVFormatParameters ap; const AVOption *opt; @@ -420,7 +419,7 @@ static demuxer_t* demux_open_lavf(demuxer_t *demuxer){ if (opt_cryptokey) parse_cryptokey(avfc, opt_cryptokey); - if (user_correct_pts != 0) + if (opts->user_correct_pts != 0) avfc->flags |= AVFMT_FLAG_GENPTS; if (index_mode == 0) avfc->flags |= AVFMT_FLAG_IGNIDX; diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c index fad06ef4c3..3bd7b64057 100644 --- a/libmpdemux/demux_mkv.c +++ b/libmpdemux/demux_mkv.c @@ -13,6 +13,7 @@ #include <ctype.h> #include <inttypes.h> +#include "options.h" #include "stream/stream.h" #include "demuxer.h" #include "stheader.h" @@ -43,7 +44,7 @@ #include "libavutil/intreadwrite.h" #include "libavutil/avstring.h" -static unsigned char sipr_swaps[38][2]={ +static const unsigned char sipr_swaps[38][2]={ {0,63},{1,22},{2,44},{3,90},{5,81},{7,31},{8,86},{9,58},{10,36},{12,68}, {13,39},{14,73},{15,53},{16,69},{17,57},{19,88},{20,34},{21,71},{24,46}, {25,94},{26,54},{28,75},{29,50},{32,70},{33,92},{35,74},{38,85},{40,56}, @@ -54,12 +55,13 @@ static unsigned char sipr_swaps[38][2]={ #define SIPR_FLAVORS 4 #define ATRC_FLAVORS 8 #define COOK_FLAVORS 34 -static int sipr_fl2bps[SIPR_FLAVORS] = {813, 1062, 625, 2000}; -static int atrc_fl2bps[ATRC_FLAVORS] = {8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100}; -static int cook_fl2bps[COOK_FLAVORS] = {1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498, - 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584, - 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513, - 12016, 16408, 22911, 33506}; +static const int sipr_fl2bps[SIPR_FLAVORS] = {813, 1062, 625, 2000}; +static const int atrc_fl2bps[ATRC_FLAVORS] = {8269, 11714, 13092, 16538, 18260, 22050, 33075, 44100}; +static const int cook_fl2bps[COOK_FLAVORS] = { + 1000, 1378, 2024, 2584, 4005, 5513, 8010, 4005, 750, 2498, + 4048, 5513, 8010, 11973, 8010, 2584, 4005, 2067, 2584, 2584, + 4005, 4005, 5513, 5513, 8010, 12059, 1550, 8010, 12059, 5513, + 12016, 16408, 22911, 33506}; typedef struct { @@ -91,7 +93,7 @@ typedef struct mkv_track int default_track; - void *private_data; + unsigned char *private_data; unsigned int private_size; /* stuff for realmedia */ @@ -179,20 +181,16 @@ typedef struct mkv_demuxer #define RAPROPERTIES4_SIZE 56 #define RAPROPERTIES5_SIZE 70 -/* for e.g. "-slang ger" */ -extern char *dvdsub_lang; -extern char *audio_lang; -extern int dvdsub_id; - /** * \brief ensures there is space for at least one additional element * \param array array to grow * \param nelem current number of elements in array * \param elsize size of one array element */ -static void grow_array(void **array, int nelem, size_t elsize) { +static void *grow_array(void *array, int nelem, size_t elsize) { if (!(nelem & 31)) - *array = realloc(*array, (nelem + 32) * elsize); + array = realloc(array, (nelem + 32) * elsize); + return array; } static mkv_track_t * @@ -217,8 +215,9 @@ add_cluster_position (mkv_demuxer_t *mkv_d, uint64_t position) if (mkv_d->cluster_positions[i] == position) return; - grow_array(&mkv_d->cluster_positions, mkv_d->num_cluster_pos, - sizeof(uint64_t)); + mkv_d->cluster_positions = grow_array(mkv_d->cluster_positions, + mkv_d->num_cluster_pos, + sizeof(uint64_t)); mkv_d->cluster_positions[mkv_d->num_cluster_pos++] = position; } @@ -1235,7 +1234,8 @@ demux_mkv_read_cues (demuxer_t *demuxer) if (time != EBML_UINT_INVALID && track != EBML_UINT_INVALID && pos != EBML_UINT_INVALID) { - grow_array(&mkv_d->indexes, mkv_d->num_indexes, sizeof(mkv_index_t)); + mkv_d->indexes = grow_array(mkv_d->indexes, mkv_d->num_indexes, + sizeof(mkv_index_t)); mkv_d->indexes[mkv_d->num_indexes].tnum = track; mkv_d->indexes[mkv_d->num_indexes].timecode = time; mkv_d->indexes[mkv_d->num_indexes].filepos =mkv_d->segment_start+pos; @@ -1396,7 +1396,6 @@ demux_mkv_read_tags (demuxer_t *demuxer) static int demux_mkv_read_attachments (demuxer_t *demuxer) { - mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv; stream_t *s = demuxer->stream; uint64_t length, l; int il; @@ -1686,6 +1685,7 @@ static const videocodec_info_t vinfo[] = { static int demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid) { + struct MPOpts *opts = demuxer->opts; BITMAPINFOHEADER *bih; void *ImageDesc = NULL; sh_video_t *sh_v; @@ -1796,7 +1796,7 @@ demux_mkv_open_video (demuxer_t *demuxer, mkv_track_t *track, int vid) bih = realloc (bih, bih->biSize); memcpy (bih + 1, track->private_data, track->private_size); } - track->reorder_timecodes = user_correct_pts == 0; + track->reorder_timecodes = opts->user_correct_pts == 0; if (!vi->id) { mp_msg (MSGT_DEMUX,MSGL_WARN, MSGTR_MPDEMUX_MKV_UnknownCodecID, track->codec_id, track->tnum); @@ -2122,13 +2122,13 @@ demux_mkv_open_audio (demuxer_t *demuxer, mkv_track_t *track, int aid) if (track->a_formattag == mmioFOURCC('f', 'L', 'a', 'C')) { - ptr = (unsigned char *)track->private_data; + ptr = track->private_data; size = track->private_size; } else { sh_a->format = mmioFOURCC('f', 'L', 'a', 'C'); - ptr = (unsigned char *) track->private_data + ptr = track->private_data + sizeof (WAVEFORMATEX); size = track->private_size - sizeof (WAVEFORMATEX); } @@ -2230,27 +2230,6 @@ demux_mkv_open_sub (demuxer_t *demuxer, mkv_track_t *track, int sid) return 0; } -static void demux_mkv_seek (demuxer_t *demuxer, float rel_seek_secs, float audio_delay, int flags); - -/** \brief Given a matroska track number and type, find the id that mplayer would ask for. - * \param d The demuxer for which the subtitle id should be returned. - * \param num The matroska track number we are looking up. - * \param type The track type. - */ -static int demux_mkv_reverse_id(mkv_demuxer_t *d, int num, int type) -{ - int i, id; - - for (i=0, id=0; i < d->num_tracks; i++) - if (d->tracks[i] != NULL && d->tracks[i]->type == type) { - if (d->tracks[i]->tnum == num) - return id; - id++; - } - - return -1; -} - static int demux_mkv_open (demuxer_t *demuxer) { @@ -2692,7 +2671,7 @@ handle_realvideo (demuxer_t *demuxer, mkv_track_t *track, uint8_t *buffer, memcpy (dp->buffer + REALHEADER_SIZE + isize, buffer, (chunks+1)*8); #endif - hdr = dp->buffer; + hdr = (uint32_t *) dp->buffer; *hdr++ = chunks; // number of chunks *hdr++ = timestamp; // timestamp from packet header *hdr++ = isize; // length of actual data diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c index 974f11d1ad..edfe7cd221 100644 --- a/libmpdemux/demux_mov.c +++ b/libmpdemux/demux_mov.c @@ -1908,6 +1908,7 @@ static int lschunks_intrak(demuxer_t* demuxer, int level, unsigned int id, } static demuxer_t* mov_read_header(demuxer_t* demuxer){ + struct MPOpts *opts = demuxer->opts; mov_priv_t* priv=demuxer->priv; int t_no; int best_a_id=-1, best_a_len=0; @@ -1983,7 +1984,7 @@ static demuxer_t* mov_read_header(demuxer_t* demuxer){ demuxer->video->id = t_no; s = new_ds_stream(demuxer->video); - od = demux_open(s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); + od = demux_open(opts, s, DEMUXER_TYPE_MPEG_PS, -1, -1, -1, NULL); if(od) return new_demuxers_demuxer(od, od, od); demuxer->video->id = -2; //new linked demuxer couldn't be allocated break; diff --git a/libmpdemux/demux_nemesi.c b/libmpdemux/demux_nemesi.c index d0669631a6..7575ee6eee 100644 --- a/libmpdemux/demux_nemesi.c +++ b/libmpdemux/demux_nemesi.c @@ -452,7 +452,7 @@ static void demux_seek_rtp(demuxer_t *demuxer, float rel_seek_secs, mp_msg(MSGT_DEMUX, MSGL_ERR, "Unsupported seek type\n"); } -static int demux_rtp_control(struct demuxer_st *demuxer, int cmd, void *arg) +static int demux_rtp_control(struct demuxer *demuxer, int cmd, void *arg) { Nemesi_DemuxerStreamData * ndsd = demuxer->priv; rtsp_ctrl * ctl = ndsd->rtsp; diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c index 4b906c3da9..3950c2be7e 100644 --- a/libmpdemux/demux_ogg.c +++ b/libmpdemux/demux_ogg.c @@ -8,6 +8,7 @@ #include <math.h> #include <inttypes.h> +#include "options.h" #include "mp_msg.h" #include "help_mp.h" #include "stream/stream.h" @@ -145,7 +146,6 @@ typedef struct ogg_demuxer { #define PACKET_IS_SYNCPOINT 0x08 extern char *dvdsub_lang, *audio_lang; -extern int dvdsub_id; //-------- subtitle support - should be moved to decoder layer, and queue // - subtitles up in demuxer buffer... @@ -395,7 +395,7 @@ static void demux_ogg_check_comments(demuxer_t *d, ogg_stream_t *os, int id, vor if (os->text && d->sub->id < 0 && demux_ogg_check_lang(val, dvdsub_lang)) { d->sub->id = index; - dvdsub_id = index; + d->opts->sub_id = index; mp_msg(MSGT_DEMUX, MSGL_V, "Ogg demuxer: Displaying subtitle stream id %d which matched -slang %s\n", id, val); } else @@ -1226,6 +1226,7 @@ static int demux_ogg_fill_buffer(demuxer_t *d, demux_stream_t *dsds) { /// For avi with Ogg audio stream we have to create an ogg demuxer for this // stream, then we join the avi and ogg demuxer with a demuxers demuxer demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) { + struct MPOpts *opts = demuxer->opts; demuxer_t *od; ogg_demuxer_t *ogg_d; stream_t* s; @@ -1287,7 +1288,7 @@ demuxer_t* init_avi_with_ogg(demuxer_t* demuxer) { // Create the ds_stream and the ogg demuxer s = new_ds_stream(demuxer->audio); - od = new_demuxer(s,DEMUXER_TYPE_OGG,0,-2,-2,NULL); + od = new_demuxer(opts, s,DEMUXER_TYPE_OGG,0,-2,-2,NULL); /// Add the header packets in the ogg demuxer audio stream for (i = 0; i < 3; i++) { diff --git a/libmpdemux/demux_rtp.cpp b/libmpdemux/demux_rtp.cpp index e622922822..fc4967f911 100644 --- a/libmpdemux/demux_rtp.cpp +++ b/libmpdemux/demux_rtp.cpp @@ -97,6 +97,7 @@ extern int rtsp_port; extern "C" int audio_id, video_id, dvdsub_id; extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) { + struct MPOpts *opts = demuxer->opts; Boolean success = False; do { TaskScheduler* scheduler = BasicTaskScheduler::createNew(); @@ -256,7 +257,7 @@ extern "C" demuxer_t* demux_open_rtp(demuxer_t* demuxer) { // code to recognize this: if (demux_is_multiplexed_rtp_stream(demuxer)) { stream_t* s = new_ds_stream(demuxer->video); - demuxer_t* od = demux_open(s, DEMUXER_TYPE_UNKNOWN, + demuxer_t* od = demux_open(opts, s, DEMUXER_TYPE_UNKNOWN, audio_id, video_id, dvdsub_id, NULL); demuxer = new_demuxers_demuxer(od, od, od); } diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c index 28d91eeaf8..1762f99741 100644 --- a/libmpdemux/demuxer.c +++ b/libmpdemux/demuxer.c @@ -9,6 +9,7 @@ #include <sys/stat.h> #include "config.h" +#include "options.h" #include "mp_msg.h" #include "help_mp.h" #include "m_config.h" @@ -78,108 +79,110 @@ extern const demuxer_desc_t demuxer_desc_nut; * demuxer, add it to libavformat, except for wrappers around external * libraries and demuxers requiring binary support. */ -const demuxer_desc_t* const demuxer_list[] = { - &demuxer_desc_rawaudio, - &demuxer_desc_rawvideo, +const demuxer_desc_t *const demuxer_list[] = { + &demuxer_desc_rawaudio, + &demuxer_desc_rawvideo, #ifdef USE_TV - &demuxer_desc_tv, + &demuxer_desc_tv, #endif - &demuxer_desc_mf, + &demuxer_desc_mf, #ifdef USE_LIBAVFORMAT - &demuxer_desc_lavf_preferred, + &demuxer_desc_lavf_preferred, #endif - &demuxer_desc_avi, - &demuxer_desc_y4m, - &demuxer_desc_asf, - &demuxer_desc_nsv, - &demuxer_desc_nuv, - &demuxer_desc_real, - &demuxer_desc_smjpeg, - &demuxer_desc_matroska, - &demuxer_desc_realaudio, - &demuxer_desc_vqf, - &demuxer_desc_mov, - &demuxer_desc_vivo, - &demuxer_desc_fli, - &demuxer_desc_film, - &demuxer_desc_roq, + &demuxer_desc_avi, + &demuxer_desc_y4m, + &demuxer_desc_asf, + &demuxer_desc_nsv, + &demuxer_desc_nuv, + &demuxer_desc_real, + &demuxer_desc_smjpeg, + &demuxer_desc_matroska, + &demuxer_desc_realaudio, + &demuxer_desc_vqf, + &demuxer_desc_mov, + &demuxer_desc_vivo, + &demuxer_desc_fli, + &demuxer_desc_film, + &demuxer_desc_roq, #ifdef HAVE_GIF - &demuxer_desc_gif, + &demuxer_desc_gif, #endif #ifdef HAVE_OGGVORBIS - &demuxer_desc_ogg, + &demuxer_desc_ogg, #endif #ifdef USE_WIN32DLL - &demuxer_desc_avs, + &demuxer_desc_avs, #endif - &demuxer_desc_pva, - &demuxer_desc_mpeg_ts, - &demuxer_desc_lmlm4, - &demuxer_desc_mpeg_ps, - &demuxer_desc_mpeg_pes, - &demuxer_desc_mpeg_es, - &demuxer_desc_mpeg_gxf, - &demuxer_desc_mpeg4_es, - &demuxer_desc_h264_es, + &demuxer_desc_pva, + &demuxer_desc_mpeg_ts, + &demuxer_desc_lmlm4, + &demuxer_desc_mpeg_ps, + &demuxer_desc_mpeg_pes, + &demuxer_desc_mpeg_es, + &demuxer_desc_mpeg_gxf, + &demuxer_desc_mpeg4_es, + &demuxer_desc_h264_es, #ifdef MUSEPACK - &demuxer_desc_mpc, + &demuxer_desc_mpc, #endif - &demuxer_desc_audio, - &demuxer_desc_mpeg_ty, + &demuxer_desc_audio, + &demuxer_desc_mpeg_ty, #ifdef STREAMING_LIVE555 - &demuxer_desc_rtp, + &demuxer_desc_rtp, #endif #ifdef LIBNEMESI - &demuxer_desc_rtp_nemesi, + &demuxer_desc_rtp_nemesi, #endif #ifdef USE_LIBAVFORMAT - &demuxer_desc_lavf, + &demuxer_desc_lavf, #endif #ifdef HAVE_LIBDV095 - &demuxer_desc_rawdv, + &demuxer_desc_rawdv, #endif - &demuxer_desc_aac, + &demuxer_desc_aac, #ifdef HAVE_LIBNUT - &demuxer_desc_nut, + &demuxer_desc_nut, #endif #ifdef HAVE_XMMS - &demuxer_desc_xmms, + &demuxer_desc_xmms, #endif - /* Please do not add any new demuxers here. If you want to implement a new - * demuxer, add it to libavformat, except for wrappers around external - * libraries and demuxers requiring binary support. */ - NULL + /* Please do not add any new demuxers here. If you want to implement a new + * demuxer, add it to libavformat, except for wrappers around external + * libraries and demuxers requiring binary support. */ + NULL }; -void free_demuxer_stream(demux_stream_t *ds){ +void free_demuxer_stream(demux_stream_t *ds) +{ ds_free_packs(ds); free(ds); } -demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){ - demux_stream_t* ds=malloc(sizeof(demux_stream_t)); - ds->buffer_pos=ds->buffer_size=0; - ds->buffer=NULL; - ds->pts=0; - ds->pts_bytes=0; - ds->eof=0; - ds->pos=0; - ds->dpos=0; - ds->pack_no=0; -//--------------- - ds->packs=0; - ds->bytes=0; - ds->first=ds->last=ds->current=NULL; - ds->id=id; - ds->demuxer=demuxer; -//---------------- - ds->asf_seq=-1; - ds->asf_packet=NULL; -//---------------- - ds->ss_mul=ds->ss_div=0; -//---------------- - ds->sh=NULL; - return ds; +demux_stream_t *new_demuxer_stream(struct demuxer *demuxer, int id) +{ + demux_stream_t *ds = malloc(sizeof(demux_stream_t)); + ds->buffer_pos = ds->buffer_size = 0; + ds->buffer = NULL; + ds->pts = 0; + ds->pts_bytes = 0; + ds->eof = 0; + ds->pos = 0; + ds->dpos = 0; + ds->pack_no = 0; + + ds->packs = 0; + ds->bytes = 0; + ds->first = ds->last = ds->current = NULL; + ds->id = id; + ds->demuxer = demuxer; + + ds->asf_seq = -1; + ds->asf_packet = NULL; + + ds->ss_mul = ds->ss_div = 0; + + ds->sh = NULL; + return ds; } @@ -189,300 +192,346 @@ demux_stream_t* new_demuxer_stream(struct demuxer_st *demuxer,int id){ * @param file_format type of the demuxer * @return structure for the demuxer, NULL if not found */ -static const demuxer_desc_t* get_demuxer_desc_from_type(int file_format) +static const demuxer_desc_t *get_demuxer_desc_from_type(int file_format) { - int i; + int i; - for (i = 0; demuxer_list[i]; i++) - if (file_format == demuxer_list[i]->type) - return demuxer_list[i]; + for (i = 0; demuxer_list[i]; i++) + if (file_format == demuxer_list[i]->type) + return demuxer_list[i]; - return NULL; + return NULL; } -demuxer_t* new_demuxer(stream_t *stream,int type,int a_id,int v_id,int s_id,char *filename){ - demuxer_t *d=malloc(sizeof(demuxer_t)); - memset(d,0,sizeof(demuxer_t)); - d->stream=stream; - d->stream_pts = MP_NOPTS_VALUE; - d->reference_clock = MP_NOPTS_VALUE; - d->movi_start=stream->start_pos; - d->movi_end=stream->end_pos; - d->seekable=1; - d->synced=0; - d->filepos=0; - d->audio=new_demuxer_stream(d,a_id); - d->video=new_demuxer_stream(d,v_id); - d->sub=new_demuxer_stream(d,s_id); - d->type=type; - if(type) - if (!(d->desc = get_demuxer_desc_from_type(type))) - mp_msg(MSGT_DEMUXER,MSGL_ERR,"BUG! Invalid demuxer type in new_demuxer(), big troubles ahead."); - if(filename) // Filename hack for avs_check_file - d->filename=strdup(filename); - stream_reset(stream); - stream_seek(stream,stream->start_pos); - return d; +demuxer_t *new_demuxer(struct MPOpts *opts, stream_t *stream, int type, + int a_id, int v_id, int s_id, char *filename) +{ + demuxer_t *d = malloc(sizeof(demuxer_t)); + memset(d, 0, sizeof(demuxer_t)); + d->stream = stream; + d->stream_pts = MP_NOPTS_VALUE; + d->reference_clock = MP_NOPTS_VALUE; + d->movi_start = stream->start_pos; + d->movi_end = stream->end_pos; + d->seekable = 1; + d->synced = 0; + d->filepos = 0; + d->audio = new_demuxer_stream(d, a_id); + d->video = new_demuxer_stream(d, v_id); + d->sub = new_demuxer_stream(d, s_id); + d->type = type; + d->opts = opts; + if (type) + if (!(d->desc = get_demuxer_desc_from_type(type))) + mp_msg(MSGT_DEMUXER, MSGL_ERR, + "BUG! Invalid demuxer type in new_demuxer(), " + "big troubles ahead."); + if (filename) // Filename hack for avs_check_file + d->filename = strdup(filename); + stream_reset(stream); + stream_seek(stream, stream->start_pos); + return d; } -extern int dvdsub_id; - -sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) { - if (id > MAX_S_STREAMS - 1 || id < 0) { - mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested sub stream id overflow (%d > %d)\n", - id, MAX_S_STREAMS); - return NULL; - } - if (demuxer->s_streams[id]) - mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id); - else { - sh_sub_t *sh = calloc(1, sizeof(sh_sub_t)); - demuxer->s_streams[id] = sh; - sh->sid = sid; - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); - } - return demuxer->s_streams[id]; +sh_sub_t *new_sh_sub_sid(demuxer_t *demuxer, int id, int sid) +{ + if (id > MAX_S_STREAMS - 1 || id < 0) { + mp_msg(MSGT_DEMUXER, MSGL_WARN, + "Requested sub stream id overflow (%d > %d)\n", id, + MAX_S_STREAMS); + return NULL; + } + if (demuxer->s_streams[id]) + mp_msg(MSGT_DEMUXER, MSGL_WARN, "Sub stream %i redefined\n", id); + else { + sh_sub_t *sh = calloc(1, sizeof(sh_sub_t)); + demuxer->s_streams[id] = sh; + sh->sid = sid; + sh->opts = demuxer->opts; + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_SUBTITLE_ID=%d\n", sid); + } + return demuxer->s_streams[id]; } -void free_sh_sub(sh_sub_t *sh) { +void free_sh_sub(sh_sub_t *sh) +{ mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_sub at %p\n", sh); free(sh->extradata); #ifdef USE_ASS - if (sh->ass_track) ass_free_track(sh->ass_track); + if (sh->ass_track) + ass_free_track(sh->ass_track); #endif free(sh->lang); free(sh); } -sh_audio_t* new_sh_audio_aid(demuxer_t *demuxer,int id,int aid){ - if(id > MAX_A_STREAMS-1 || id < 0) - { - mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested audio stream id overflow (%d > %d)\n", - id, MAX_A_STREAMS); - return NULL; +sh_audio_t *new_sh_audio_aid(demuxer_t *demuxer, int id, int aid) +{ + if (id > MAX_A_STREAMS - 1 || id < 0) { + mp_msg(MSGT_DEMUXER, MSGL_WARN, + "Requested audio stream id overflow (%d > %d)\n", id, + MAX_A_STREAMS); + return NULL; } - if(demuxer->a_streams[id]){ - mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_AudioStreamRedefined,id); + if (demuxer->a_streams[id]) { + mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_AudioStreamRedefined, id); } else { sh_audio_t *sh; - mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundAudioStream,id); - demuxer->a_streams[id]=calloc(1, sizeof(sh_audio_t)); + mp_msg(MSGT_DEMUXER, MSGL_V, MSGTR_FoundAudioStream, id); + demuxer->a_streams[id] = calloc(1, sizeof(sh_audio_t)); sh = demuxer->a_streams[id]; // set some defaults - sh->samplesize=2; - sh->sample_format=AF_FORMAT_S16_NE; - sh->audio_out_minsize=8192;/* default size, maybe not enough for Win32/ACM*/ - sh->pts=MP_NOPTS_VALUE; - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid); + sh->samplesize = 2; + sh->sample_format = AF_FORMAT_S16_NE; + sh->audio_out_minsize = 8192; /* default size, maybe not enough for Win32/ACM */ + sh->pts = MP_NOPTS_VALUE; + sh->opts = demuxer->opts; + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_AUDIO_ID=%d\n", aid); } - ((sh_audio_t *)demuxer->a_streams[id])->aid = aid; + ((sh_audio_t *) demuxer->a_streams[id])->aid = aid; return demuxer->a_streams[id]; } -void free_sh_audio(demuxer_t *demuxer, int id) { +void free_sh_audio(demuxer_t *demuxer, int id) +{ sh_audio_t *sh = demuxer->a_streams[id]; demuxer->a_streams[id] = NULL; - mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_audio at %p\n",sh); + mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_audio at %p\n", sh); free(sh->wf); free(sh->codecdata); free(sh->lang); free(sh); } -sh_video_t* new_sh_video_vid(demuxer_t *demuxer,int id,int vid){ - if(id > MAX_V_STREAMS-1 || id < 0) - { - mp_msg(MSGT_DEMUXER,MSGL_WARN,"Requested video stream id overflow (%d > %d)\n", - id, MAX_V_STREAMS); - return NULL; +sh_video_t *new_sh_video_vid(demuxer_t *demuxer, int id, int vid) +{ + if (id > MAX_V_STREAMS - 1 || id < 0) { + mp_msg(MSGT_DEMUXER, MSGL_WARN, + "Requested video stream id overflow (%d > %d)\n", id, + MAX_V_STREAMS); + return NULL; } - if(demuxer->v_streams[id]){ - mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_VideoStreamRedefined,id); - } else { - mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_FoundVideoStream,id); - demuxer->v_streams[id]=calloc(1, sizeof(sh_video_t)); - mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid); + if (demuxer->v_streams[id]) + mp_msg(MSGT_DEMUXER, MSGL_WARN, MSGTR_VideoStreamRedefined, id); + else { + mp_msg(MSGT_DEMUXER, MSGL_V, MSGTR_FoundVideoStream, id); + sh_video_t *sh = calloc(1, sizeof *sh); + demuxer->v_streams[id] = sh; + sh->opts = demuxer->opts; + mp_msg(MSGT_IDENTIFY, MSGL_INFO, "ID_VIDEO_ID=%d\n", vid); } - ((sh_video_t *)demuxer->v_streams[id])->vid = vid; + ((sh_video_t *) demuxer->v_streams[id])->vid = vid; return demuxer->v_streams[id]; } -void free_sh_video(sh_video_t* sh){ - mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing sh_video at %p\n",sh); +void free_sh_video(sh_video_t *sh) +{ + mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing sh_video at %p\n", sh); free(sh->bih); free(sh); } -void free_demuxer(demuxer_t *demuxer){ +void free_demuxer(demuxer_t *demuxer) +{ int i; - mp_msg(MSGT_DEMUXER,MSGL_DBG2,"DEMUXER: freeing demuxer at %p\n",demuxer); - if(demuxer->desc->close) - demuxer->desc->close(demuxer); + mp_msg(MSGT_DEMUXER, MSGL_DBG2, "DEMUXER: freeing demuxer at %p\n", + demuxer); + if (demuxer->desc->close) + demuxer->desc->close(demuxer); // Very ugly hack to make it behave like old implementation if (demuxer->desc->type == DEMUXER_TYPE_DEMUXERS) - goto skip_streamfree; + goto skip_streamfree; // free streams: - for(i = 0; i < MAX_A_STREAMS; i++) - if(demuxer->a_streams[i]) free_sh_audio(demuxer, i); - for(i = 0; i < MAX_V_STREAMS; i++) - if(demuxer->v_streams[i]) free_sh_video(demuxer->v_streams[i]); - for(i = 0; i < MAX_S_STREAMS; i++) - if(demuxer->s_streams[i]) free_sh_sub(demuxer->s_streams[i]); + for (i = 0; i < MAX_A_STREAMS; i++) + if (demuxer->a_streams[i]) + free_sh_audio(demuxer, i); + for (i = 0; i < MAX_V_STREAMS; i++) + if (demuxer->v_streams[i]) + free_sh_video(demuxer->v_streams[i]); + for (i = 0; i < MAX_S_STREAMS; i++) + if (demuxer->s_streams[i]) + free_sh_sub(demuxer->s_streams[i]); // free demuxers: free_demuxer_stream(demuxer->audio); free_demuxer_stream(demuxer->video); free_demuxer_stream(demuxer->sub); -skip_streamfree: - if(demuxer->info) { - for(i=0;demuxer->info[i] != NULL; i++) - free(demuxer->info[i]); - free(demuxer->info); + skip_streamfree: + if (demuxer->info) { + for (i = 0; demuxer->info[i] != NULL; i++) + free(demuxer->info[i]); + free(demuxer->info); } free(demuxer->filename); if (demuxer->chapters) { - for (i=0; i<demuxer->num_chapters; i++) - free(demuxer->chapters[i].name); - free(demuxer->chapters); + for (i = 0; i < demuxer->num_chapters; i++) + free(demuxer->chapters[i].name); + free(demuxer->chapters); } if (demuxer->attachments) { - for (i=0; i<demuxer->num_attachments; i++) { - free(demuxer->attachments[i].name); - free(demuxer->attachments[i].type); - free(demuxer->attachments[i].data); - } - free(demuxer->attachments); + for (i = 0; i < demuxer->num_attachments; i++) { + free(demuxer->attachments[i].name); + free(demuxer->attachments[i].type); + free(demuxer->attachments[i].data); + } + free(demuxer->attachments); } free(demuxer); } -void ds_add_packet(demux_stream_t *ds,demux_packet_t* dp){ -// demux_packet_t* dp=new_demux_packet(len); -// stream_read(stream,dp->buffer,len); -// dp->pts=pts; //(float)pts/90000.0f; -// dp->pos=pos; +void ds_add_packet(demux_stream_t *ds, demux_packet_t *dp) +{ // append packet to DS stream: ++ds->packs; - ds->bytes+=dp->len; - if(ds->last){ - // next packet in stream - ds->last->next=dp; - ds->last=dp; + ds->bytes += dp->len; + if (ds->last) { + // next packet in stream + ds->last->next = dp; + ds->last = dp; } else { - // first packet in stream - ds->first=ds->last=dp; + // first packet in stream + ds->first = ds->last = dp; } - mp_dbg(MSGT_DEMUXER,MSGL_DBG2,"DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%u [packs: A=%d V=%d]\n", - (ds==ds->demuxer->audio)?"d_audio":"d_video", - dp->len,dp->pts,(unsigned int)dp->pos,ds->demuxer->audio->packs,ds->demuxer->video->packs); + mp_dbg(MSGT_DEMUXER, MSGL_DBG2, + "DEMUX: Append packet to %s, len=%d pts=%5.3f pos=%u [packs: A=%d V=%d]\n", + (ds == ds->demuxer->audio) ? "d_audio" : "d_video", dp->len, + dp->pts, (unsigned int) dp->pos, ds->demuxer->audio->packs, + ds->demuxer->video->packs); } -void ds_read_ |