summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/aviheader.c2
-rw-r--r--libmpdemux/demux_avi.c7
-rw-r--r--libmpdemux/demux_lavf.c7
-rw-r--r--libmpdemux/demux_mkv.c24
-rw-r--r--libmpdemux/demux_mov.c3
-rw-r--r--libmpdemux/demux_nemesi.c2
-rw-r--r--libmpdemux/demux_ogg.c7
-rw-r--r--libmpdemux/demux_rtp.cpp3
-rw-r--r--libmpdemux/demuxer.c1789
-rw-r--r--libmpdemux/demuxer.h55
-rw-r--r--libmpdemux/parse_mp4.c2
-rw-r--r--libmpdemux/stheader.h31
12 files changed, 1047 insertions, 885 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..72d68c98ac 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
{
@@ -179,11 +181,6 @@ 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
@@ -1686,6 +1683,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 +1794,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);
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_packet(demux_stream_t *ds, stream_t *stream, int len, double pts, off_t pos, int flags) {
- demux_packet_t* dp=new_demux_packet(len);
- len = stream_read(stream,dp->buffer,len);
+void ds_read_packet(demux_stream_t *ds, stream_t *stream, int len,
+ double pts, off_t pos, int flags)
+{
+ demux_packet_t *dp = new_demux_packet(len);
+ len = stream_read(stream, dp->buffer, len);
resize_demux_packet(dp, len);
- dp->pts=pts; //(float)pts/90000.0f;
- dp->pos=pos;
- dp->flags=flags;
+ dp->pts = pts;
+ dp->pos = pos;
+ dp->flags = flags;
// append packet to DS stream:
- ds_add_packet(ds,dp);
+ ds_add_packet(ds, dp);
}
// return value:
// 0 = EOF or no stream found or invalid type
// 1 = successfully read a packet
-int demux_fill_buffer(demuxer_t *demux,demux_stream_t *ds){
- // Note: parameter 'ds' can be NULL!
-// printf("demux->type=%d\n",demux->type);
- return demux->desc->fill_buffer(demux, ds);
+int demux_fill_buffer(demuxer_t *demux, demux_stream_t *ds)
+{
+ // Note: parameter 'ds' can be NULL!
+ return demux->desc->fill_buffer(demux, ds);
}
// return value:
// 0 = EOF
// 1 = successful
#define MAX_ACUMULATED_PACKETS 64
-int ds_fill_buffer(demux_stream_t *ds){
- demuxer_t *demux=ds->demuxer;
- if(ds->current) free_demux_packet(ds->current);
- ds->current=NULL;
- if( mp_msg_test(MSGT_DEMUXER,MSGL_DBG3) ){
- if(ds==demux->audio) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_audio) called\n");else
- if(ds==demux->video) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_video) called\n");else
- if(ds==demux->sub) mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(d_sub) called\n");else
- mp_dbg(MSGT_DEMUXER,MSGL_DBG3,"ds_fill_buffer(unknown 0x%X) called\n",(unsigned int)ds);
- }
- while(1){
- if(ds->packs){
- demux_packet_t *p=ds->first;
+int ds_fill_buffer(demux_stream_t *ds)
+{
+ demuxer_t *demux = ds->demuxer;
+ if (ds->current)
+ free_demux_packet(ds->current);
+ ds->current = NULL;
+ if (mp_msg_test(MSGT_DEMUXER, MSGL_DBG3)) {
+ if (ds == demux->audio)
+ mp_dbg(MSGT_DEMUXER, MSGL_DBG3,
+ "ds_fill_buffer(d_audio) called\n");
+ else if (ds == demux->video)
+ mp_dbg(MSGT_DEMUXER, MSGL_DBG3,
+ "ds_fill_buffer(d_video) called\n");
+ else if (ds == demux->sub)
+ mp_dbg(MSGT_DEMUXER, MSGL_DBG3, "ds_fill_buffer(d_sub) called\n");
+ else
+ mp_dbg(MSGT_DEMUXER, MSGL_DBG3,
+ "ds_fill_buffer(unknown 0x%X) called\n", (unsigned int) ds);
+ }
+ while (1) {
+ if (ds->packs) {
+ demux_packet_t *p = ds->first;
#if 0
- if(demux->reference_clock != MP_NOPTS_VALUE) {
- if((p->pts != MP_NOPTS_VALUE) && (p->pts > demux->reference_clock)
- && (ds->packs < MAX_ACUMULATED_PACKETS)) {
- if(demux_fill_buffer(demux,ds))
- continue;
- }
- }
+ if (demux->reference_clock != MP_NOPTS_VALUE) {
+ if ((p->pts != MP_NOPTS_VALUE)
+ && (p->pts > demux->reference_clock)
+ && (ds->packs < MAX_ACUMULATED_PACKETS)) {
+ if (demux_fill_buffer(demux, ds))
+ continue;
+ }
+ }
#endif
- // copy useful data:
- ds->buffer=p->buffer;
- ds->buffer_pos=0;
- ds->buffer_size=p->len;
- ds->pos=p->pos;
- ds->dpos+=p->len; // !!!
- ++ds->pack_no;
- if (p->pts != MP_NOPTS_VALUE) {
- ds->pts=p->pts;
- ds->pts_bytes=0;
- }
- ds->pts_bytes+=p->len; // !!!
- if(p->stream_pts != MP_NOPTS_VALUE) demux->stream_pts=p-&g