summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2012-07-28 17:07:49 +0200
committerwm4 <wm4@mplayer2.org>2012-07-28 17:24:05 +0200
commit51e198c2a1e43b74ad35ef358628dcd8791158d9 (patch)
tree60f6c2255ed912a7a4866b71728104a2cb2442f1 /libmpdemux
parent2793e7eb70a342b346788f83e1ed660c8e0d491e (diff)
parent7dfaaa95104a8e6dc024fddaf1b49c71768f1be7 (diff)
downloadmpv-51e198c2a1e43b74ad35ef358628dcd8791158d9.tar.bz2
mpv-51e198c2a1e43b74ad35ef358628dcd8791158d9.tar.xz
Merge remote-tracking branch 'origin/master'
Conflicts: .gitignore bstr.c cfg-mplayer.h defaultopts.c libvo/video_out.c The conflict in bstr.c is due to uau adding a bstr_getline function in commit 2ba8b91a97e7e8. This function already existed in this branch. While uau's function is obviously derived from mine, it's incompatible. His function preserves line breaks, while mine strips them. Add a bstr_strip_linebreaks function, fix all other uses of bstr_getline, and pick uau's implementation. In .gitignore, change vo_gl3_shaders.h to use an absolute path additional to resolving the merge conflict.
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demux_asf.c5
-rw-r--r--libmpdemux/demux_film.c3
-rw-r--r--libmpdemux/demux_lavf.c16
-rw-r--r--libmpdemux/demux_mf.c2
-rw-r--r--libmpdemux/demux_mkv.c55
-rw-r--r--libmpdemux/demux_mov.c1
-rw-r--r--libmpdemux/demux_nut.c2
-rw-r--r--libmpdemux/demux_ogg.c36
-rw-r--r--libmpdemux/demux_packet.h3
-rw-r--r--libmpdemux/demux_rawdv.c1
-rw-r--r--libmpdemux/demux_real.c6
-rw-r--r--libmpdemux/demux_realaud.c3
-rw-r--r--libmpdemux/demux_ts.c2
-rw-r--r--libmpdemux/demux_ty.c1
-rw-r--r--libmpdemux/demux_y4m.c1
-rw-r--r--libmpdemux/demuxer.c38
-rw-r--r--libmpdemux/demuxer.h4
-rw-r--r--libmpdemux/ebml_defs.c424
-rw-r--r--libmpdemux/ebml_types.h477
-rw-r--r--libmpdemux/stheader.h2
-rw-r--r--libmpdemux/video.c2
21 files changed, 77 insertions, 1007 deletions
diff --git a/libmpdemux/demux_asf.c b/libmpdemux/demux_asf.c
index eb71d4ef96..68ccab07d2 100644
--- a/libmpdemux/demux_asf.c
+++ b/libmpdemux/demux_asf.c
@@ -177,7 +177,7 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
dp->pts=time*0.0000001;
else
dp->pts=time*0.001;
- dp->flags=keyframe;
+ dp->keyframe = keyframe;
// if(ds==demux->video) printf("ASF time: %8d dur: %5d \n",time,dur);
dp->pos=demux->filepos;
ds->asf_packet=dp;
@@ -595,7 +595,8 @@ static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,float audio_de
continue;
}
}
- if(d_video->flags&1) break; // found a keyframe!
+ if (d_video->keyframe)
+ break;
if(!ds_fill_buffer(d_video)) break; // skip frame. EOF?
}
diff --git a/libmpdemux/demux_film.c b/libmpdemux/demux_film.c
index 8575d5f1e8..713c9ea26e 100644
--- a/libmpdemux/demux_film.c
+++ b/libmpdemux/demux_film.c
@@ -130,7 +130,6 @@ static int demux_film_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
return 0;
dp->pts = film_chunk.pts;
dp->pos = film_chunk.chunk_offset;
- dp->flags = 0;
// adjust the data before queuing it:
// 8-bit: signed -> unsigned
@@ -197,7 +196,7 @@ static int demux_film_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
dp->pts = film_chunk.pts;
dp->pos = film_chunk.chunk_offset;
- dp->flags = (film_chunk.syncinfo1 & 0x80000000) ? 1 : 0;
+ dp->keyframe = film_chunk.syncinfo1 & 0x80000000;
// fix the CVID chunk size
cvid_size = film_chunk.chunk_size - length_fix_bytes;
diff --git a/libmpdemux/demux_lavf.c b/libmpdemux/demux_lavf.c
index 62cb0bad1b..1487a6db6b 100644
--- a/libmpdemux/demux_lavf.c
+++ b/libmpdemux/demux_lavf.c
@@ -245,8 +245,6 @@ static const char * const preferred_internal[] = {
/* lavf Matroska demuxer doesn't support ordered chapters and fails
* for more files */
"matroska",
- /* lavf gives neither pts nor dts for some video frames in .rm */
- "rm",
NULL
};
@@ -310,6 +308,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
break;
stream_type = "audio";
priv->astreams[priv->audio_streams] = i;
+ sh_audio->libav_codec_id = codec->codec_id;
wf = calloc(sizeof(*wf) + codec->extradata_size, 1);
// mp4a tag is used for all mp4 files no matter what they actually contain
if (codec->codec_tag == MKTAG('m', 'p', '4', 'a'))
@@ -387,6 +386,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
break;
stream_type = "video";
priv->vstreams[priv->video_streams] = i;
+ sh_video->libav_codec_id = codec->codec_id;
bih = calloc(sizeof(*bih) + codec->extradata_size, 1);
if (codec->codec_id == CODEC_ID_RAWVIDEO) {
@@ -398,9 +398,14 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
}
if (!codec->codec_tag)
codec->codec_tag = avcodec_pix_fmt_to_codec_tag(codec->pix_fmt);
- }
- if (!codec->codec_tag)
+ } else if (!codec->codec_tag) {
codec->codec_tag = mp_taglist_video(codec->codec_id);
+ /* 0 might mean either unset or rawvideo; if codec_id
+ * was not RAWVIDEO assume it's unset
+ */
+ if (!codec->codec_tag)
+ codec->codec_tag = -1;
+ }
bih->biSize = sizeof(*bih) + codec->extradata_size;
bih->biWidth = codec->width;
bih->biHeight = codec->height;
@@ -492,6 +497,7 @@ static void handle_stream(demuxer_t *demuxer, AVFormatContext *avfc, int i)
break;
stream_type = "subtitle";
priv->sstreams[priv->sub_streams] = i;
+ sh_sub->libav_codec_id = codec->codec_id;
sh_sub->type = type;
if (codec->extradata_size) {
sh_sub->extradata = malloc(codec->extradata_size);
@@ -808,7 +814,7 @@ static int demux_lavf_fill_buffer(demuxer_t *demux, demux_stream_t *dsds)
av_q2d(priv->avfc->streams[id]->time_base);
}
dp->pos = demux->filepos;
- dp->flags = !!(pkt->flags & AV_PKT_FLAG_KEY);
+ dp->keyframe = pkt->flags & AV_PKT_FLAG_KEY;
// append packet to DS stream:
ds_add_packet(ds, dp);
return 1;
diff --git a/libmpdemux/demux_mf.c b/libmpdemux/demux_mf.c
index 193b17bc18..7112fd4059 100644
--- a/libmpdemux/demux_mf.c
+++ b/libmpdemux/demux_mf.c
@@ -66,7 +66,7 @@ static int demux_mf_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){
if ( !fread( dp->buffer,file_size,1,f ) ) return 0;
dp->pts=mf->curr_frame / sh_video->fps;
dp->pos=mf->curr_frame;
- dp->flags=0;
+ dp->keyframe = true;
// append packet to DS stream:
ds_add_packet( demuxer->video,dp );
}
diff --git a/libmpdemux/demux_mkv.c b/libmpdemux/demux_mkv.c
index 27bc45acc9..b0f45758d7 100644
--- a/libmpdemux/demux_mkv.c
+++ b/libmpdemux/demux_mkv.c
@@ -1840,7 +1840,7 @@ static int demux_mkv_read_block_lacing(uint8_t *buffer, uint64_t *size,
}
static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
- uint8_t *buffer, uint32_t size, int64_t block_bref)
+ uint8_t *buffer, uint32_t size, bool keyframe)
{
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
demux_packet_t *dp;
@@ -1860,13 +1860,13 @@ static void handle_realvideo(demuxer_t *demuxer, mkv_track_t *track,
biCompression, &track->rv_kf_base,
&track->rv_kf_pts, NULL);
dp->pos = demuxer->filepos;
- dp->flags = block_bref ? 0 : 0x10;
+ dp->keyframe = keyframe;
ds_add_packet(demuxer->video, dp);
}
static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
- uint8_t *buffer, uint32_t size, int64_t block_bref)
+ uint8_t *buffer, uint32_t size, bool keyframe)
{
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
int sps = track->sub_packet_size;
@@ -1952,7 +1952,7 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
dp->pts = (x * apk_usize % w) ? 0 :
track->audio_timestamp[x * apk_usize / w];
dp->pos = track->audio_filepos; // all equal
- dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
+ dp->keyframe = !x; // Mark first packet as keyframe
ds_add_packet(demuxer->audio, dp);
}
}
@@ -1966,14 +1966,14 @@ static void handle_realaudio(demuxer_t *demuxer, mkv_track_t *track,
track->ra_pts = mkv_d->last_pts;
dp->pos = demuxer->filepos;
- dp->flags = block_bref ? 0 : 0x10;
+ dp->keyframe = keyframe;
ds_add_packet(demuxer->audio, dp);
}
}
static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
- uint64_t block_duration, int64_t block_bref,
- int64_t block_fref, uint8_t simpleblock)
+ uint64_t block_duration, bool keyframe,
+ bool simpleblock)
{
mkv_demuxer_t *mkv_d = (mkv_demuxer_t *) demuxer->priv;
mkv_track_t *track = NULL;
@@ -1995,6 +1995,8 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
length -= tmp + 2;
old_length = length;
flags = block[0];
+ if (simpleblock)
+ keyframe = flags & 0x80;
if (demux_mkv_read_block_lacing(block, &length, &laces, &lace_size))
return 0;
block += old_length - length;
@@ -2015,13 +2017,8 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
&& track->id == demuxer->audio->id) {
ds = demuxer->audio;
- if (mkv_d->a_skip_to_keyframe) {
- if (simpleblock) {
- if (!(flags & 0x80)) /*current frame isn't a keyframe */
- use_this_block = 0;
- } else if (block_bref != 0)
- use_this_block = 0;
- }
+ if (mkv_d->a_skip_to_keyframe)
+ use_this_block = keyframe;
if (mkv_d->v_skip_to_keyframe)
use_this_block = 0;
@@ -2043,13 +2040,8 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
else if (track->type == MATROSKA_TRACK_VIDEO
&& track->id == demuxer->video->id) {
ds = demuxer->video;
- if (mkv_d->v_skip_to_keyframe) {
- if (simpleblock) {
- if (!(flags & 0x80)) /*current frame isn't a keyframe */
- use_this_block = 0;
- } else if (block_bref != 0 || block_fref != 0)
- use_this_block = 0;
- }
+ if (mkv_d->v_skip_to_keyframe)
+ use_this_block = keyframe;
} else if (track->type == MATROSKA_TRACK_SUBTITLE
&& track->id == demuxer->sub->id) {
ds = demuxer->sub;
@@ -2069,10 +2061,10 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
for (i = 0; i < laces; i++) {
if (ds == demuxer->video && track->realmedia)
handle_realvideo(demuxer, track, block, lace_size[i],
- block_bref);
+ keyframe);
else if (ds == demuxer->audio && track->realmedia)
handle_realaudio(demuxer, track, block, lace_size[i],
- block_bref);
+ keyframe);
else {
int size = lace_size[i];
demux_packet_t *dp;
@@ -2083,8 +2075,7 @@ static int handle_block(demuxer_t *demuxer, uint8_t *block, uint64_t length,
memcpy(dp->buffer, buffer, size);
if (buffer != block)
talloc_free(buffer);
- dp->flags = (block_bref == 0
- && block_fref == 0) ? 0x10 : 0;
+ dp->keyframe = keyframe;
/* If default_duration is 0, assume no pts value is known
* for packets after the first one (rather than all pts
* values being the same) */
@@ -2122,7 +2113,7 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
while (1) {
while (mkv_d->cluster_size > 0) {
uint64_t block_duration = 0, block_length = 0;
- int64_t block_bref = 0, block_fref = 0;
+ bool keyframe = true;
uint8_t *block = NULL;
while (mkv_d->blockgroup_size > 0) {
@@ -2157,10 +2148,8 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
free(block);
return 0;
}
- if (num <= 0)
- block_bref = num;
- else
- block_fref = num;
+ if (num)
+ keyframe = false;
break;
case EBML_ID_INVALID:
@@ -2177,8 +2166,7 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
if (block) {
int res = handle_block(demuxer, block, block_length,
- block_duration, block_bref, block_fref,
- 0);
+ block_duration, keyframe, false);
free(block);
if (res < 0)
return 0;
@@ -2216,8 +2204,7 @@ static int demux_mkv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
}
l = tmp + block_length;
res = handle_block(demuxer, block, block_length,
- block_duration, block_bref,
- block_fref, 1);
+ block_duration, false, true);
free(block);
mkv_d->cluster_size -= l + il;
if (res < 0)
diff --git a/libmpdemux/demux_mov.c b/libmpdemux/demux_mov.c
index bccf808465..96fb1a2d86 100644
--- a/libmpdemux/demux_mov.c
+++ b/libmpdemux/demux_mov.c
@@ -2195,7 +2195,6 @@ if(trak->pos==0 && trak->stream_header_len>0){
trak->stream_header = NULL;
trak->stream_header_len = 0;
dp->pts=pts;
- dp->flags=0;
dp->pos=pos; // FIXME?
ds_add_packet(ds,dp);
} else
diff --git a/libmpdemux/demux_nut.c b/libmpdemux/demux_nut.c
index efa20e0c47..e6602ef506 100644
--- a/libmpdemux/demux_nut.c
+++ b/libmpdemux/demux_nut.c
@@ -238,7 +238,7 @@ static int demux_nut_fill_buffer(demuxer_t * demuxer, demux_stream_t * dsds) {
dp->pts = pts;
dp->pos = demuxer->filepos;
- dp->flags= (pd.flags & NUT_FLAG_KEY) ? 0x10 : 0;
+ dp->keyframe = pd.flags & NUT_FLAG_KEY;
{int len = pd.len;
while ((ret = nut_read_frame(nut, &len, dp->buffer + pd.len-len)) == NUT_ERR_EAGAIN);
diff --git a/libmpdemux/demux_ogg.c b/libmpdemux/demux_ogg.c
index d38d68cb79..9eea061106 100644
--- a/libmpdemux/demux_ogg.c
+++ b/libmpdemux/demux_ogg.c
@@ -258,13 +258,13 @@ static int demux_ogg_get_page_stream(ogg_demuxer_t *ogg_d,
}
static unsigned char *demux_ogg_read_packet(ogg_stream_t *os, ogg_packet *pack,
- float *pts, int *flags,
+ float *pts, bool *keyframe,
int samplesize)
{
unsigned char *data = pack->packet;
*pts = MP_NOPTS_VALUE;
- *flags = 0;
+ *keyframe = false;
if (os->vorbis) {
if (*pack->packet & PACKET_TYPE_HEADER) {
@@ -283,7 +283,7 @@ static unsigned char *demux_ogg_read_packet(ogg_stream_t *os, ogg_packet *pack,
if (os->lastsize > 0)
pack->granulepos += os->lastsize;
} else
- *flags = 1;
+ *keyframe = true;
if (vi)
*pts = pack->granulepos / (float)vi->rate;
os->lastsize = blocksize;
@@ -306,7 +306,7 @@ static unsigned char *demux_ogg_read_packet(ogg_stream_t *os, ogg_packet *pack,
if (pack->granulepos >= 0) {
os->lastpos = pack->granulepos >> keyframe_granule_shift;
os->lastpos += pack->granulepos & iframemask;
- *flags = (pack->granulepos & iframemask) == 0;
+ *keyframe = (pack->granulepos & iframemask) == 0;
} else {
os->lastpos++;
}
@@ -332,7 +332,7 @@ static unsigned char *demux_ogg_read_packet(ogg_stream_t *os, ogg_packet *pack,
pack->granulepos = os->lastpos + (os->lastsize ? os->lastsize : 1);
// If we already have a timestamp it can be a syncpoint
if (*pack->packet & PACKET_IS_SYNCPOINT)
- *flags = 1;
+ *keyframe = true;
*pts = pack->granulepos / os->samplerate;
// Save the packet length and timestamp
os->lastsize = 0;
@@ -474,10 +474,6 @@ static int demux_ogg_add_packet(demux_stream_t *ds, ogg_stream_t *os,
int id, ogg_packet *pack)
{
demuxer_t *d = ds->demuxer;
- demux_packet_t *dp;
- unsigned char *data;
- float pts = 0;
- int flags = 0;
int samplesize = 1;
// If packet is an comment header then we try to get comments at first
@@ -520,7 +516,10 @@ static int demux_ogg_add_packet(demux_stream_t *ds, ogg_stream_t *os,
if (ds == d->audio && ((sh_audio_t*)ds->sh)->format == FOURCC_VORBIS) {
samplesize = ((sh_audio_t *)ds->sh)->samplesize;
}
- data = demux_ogg_read_packet(os, pack, &pts, &flags, samplesize);
+ bool keyframe;
+ float pts;
+ unsigned char *data;
+ data = demux_ogg_read_packet(os, pack, &pts, &keyframe, samplesize);
if (!data)
return 0;
@@ -530,14 +529,15 @@ static int demux_ogg_add_packet(demux_stream_t *ds, ogg_stream_t *os,
vo_osd_changed(OSDTYPE_SUBTITLE);
}
/// Send the packet
+ struct demux_packet *dp;
dp = new_demux_packet(pack->bytes - (data - pack->packet));
memcpy(dp->buffer, data, pack->bytes - (data - pack->packet));
dp->pts = pts;
- dp->flags = flags;
+ dp->keyframe = keyframe;
ds_add_packet(ds, dp);
mp_msg(MSGT_DEMUX, MSGL_DBG2,
- "New dp: %p ds=%p pts=%5.3f len=%d flag=%d \n",
- dp, ds, pts, dp->len, flags);
+ "New dp: %p ds=%p pts=%5.3f len=%d keyframe=%d \n",
+ dp, ds, pts, dp->len, keyframe);
return 1;
}
@@ -606,12 +606,12 @@ static void demux_ogg_scan_stream(demuxer_t *demuxer)
p = 0;
while (ogg_stream_packetout(oss, &op) == 1) {
float pts;
- int flags;
+ bool keyframe;
- demux_ogg_read_packet(os, &op, &pts, &flags, samplesize);
+ demux_ogg_read_packet(os, &op, &pts, &keyframe, samplesize);
if (op.granulepos >= 0) {
ogg_d->final_granulepos = op.granulepos;
- if (ogg_d->initial_granulepos == MP_NOPTS_VALUE && (flags & 1)) {
+ if (ogg_d->initial_granulepos == MP_NOPTS_VALUE && keyframe) {
ogg_d->initial_granulepos = op.granulepos;
if (index_mode != 2 && ogg_d->pos < demuxer->movi_end - 2 * 270000) {
//the 270000 are just a wild guess
@@ -621,7 +621,7 @@ static void demux_ogg_scan_stream(demuxer_t *demuxer)
}
}
}
- if (index_mode == 2 && (flags || (os->vorbis && op.granulepos >= 0))) {
+ if (index_mode == 2 && (keyframe || (os->vorbis && op.granulepos >= 0))) {
if (ogg_d->num_syncpoint > SIZE_MAX / sizeof(ogg_syncpoint_t) - 1)
break;
ogg_d->syncpoints = realloc_struct(ogg_d->syncpoints, (ogg_d->num_syncpoint + 1), sizeof(ogg_syncpoint_t));
@@ -1415,7 +1415,7 @@ static void demux_ogg_seek(demuxer_t *demuxer, float rel_seek_secs,
int np;
int is_gp_valid;
float pts;
- int is_keyframe;
+ bool is_keyframe;
int samplesize = 1;
ogg_int64_t granulepos_orig;
diff --git a/libmpdemux/demux_packet.h b/libmpdemux/demux_packet.h
index 30cd0010f5..d64291f4e0 100644
--- a/libmpdemux/demux_packet.h
+++ b/libmpdemux/demux_packet.h
@@ -19,6 +19,7 @@
#ifndef MPLAYER_DEMUX_PACKET_H
#define MPLAYER_DEMUX_PACKET_H
+#include <stdbool.h>
#include <sys/types.h>
// Holds one packet/frame/whatever
@@ -29,7 +30,7 @@ typedef struct demux_packet {
double stream_pts;
off_t pos; // position in index (AVI) or file (MPG)
unsigned char *buffer;
- int flags; // keyframe, etc
+ bool keyframe;
int refcount; // counter for the master packet, if 0, buffer can be free()d
struct demux_packet *master; //in clones, pointer to the master packet
struct demux_packet *next;
diff --git a/libmpdemux/demux_rawdv.c b/libmpdemux/demux_rawdv.c
index f0b081318c..1e0a27e9f4 100644
--- a/libmpdemux/demux_rawdv.c
+++ b/libmpdemux/demux_rawdv.c
@@ -124,7 +124,6 @@ static int demux_rawdv_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
return 0;
dp_video->pts=frames->current_frame/sh_video->fps;
dp_video->pos=frames->current_filepos;
- dp_video->flags=0;
if (demuxer->audio && demuxer->audio->id>=-1)
{
diff --git a/libmpdemux/demux_real.c b/libmpdemux/demux_real.c
index 687441f863..ea9c3046e0 100644
--- a/libmpdemux/demux_real.c
+++ b/libmpdemux/demux_real.c
@@ -794,7 +794,7 @@ got_audio:
if (x * apk_usize % w == 0)
dp->pts = priv->audio_timestamp[x * apk_usize / w];
dp->pos = priv->audio_filepos; // all equal
- dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
+ dp->keyframe = !x; // Mark first packet as keyframe
ds_add_packet(ds, dp);
}
}
@@ -839,7 +839,7 @@ got_audio:
dp->pts = timestamp/1000.0;
priv->a_pts=timestamp;
dp->pos = demuxer->filepos;
- dp->flags = (flags & 0x2) ? 0x10 : 0;
+ dp->keyframe = flags & 0x2;
ds_add_packet(ds, dp);
} // codec_id check, codec default case
@@ -1003,7 +1003,7 @@ got_video:
dp = new_demux_packet(sizeof(dp_hdr_t)+vpkg_length+8*(1+2*(vpkg_header&0x3F)));
// the timestamp seems to be in milliseconds
dp->pos = demuxer->filepos;
- dp->flags = (flags & 0x2) ? 0x10 : 0;
+ dp->keyframe = flags & 0x2;
ds->asf_seq = vpkg_seqnum;
dp_hdr=(dp_hdr_t*)dp->buffer;
dp_hdr->chunks=0;
diff --git a/libmpdemux/demux_realaud.c b/libmpdemux/demux_realaud.c
index ece05edf1e..d42b98a023 100644
--- a/libmpdemux/demux_realaud.c
+++ b/libmpdemux/demux_realaud.c
@@ -139,7 +139,7 @@ static int demux_ra_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
memcpy(dp->buffer, ra_priv->audio_buf + x * len, len);
dp->pts = x ? 0 : demuxer->filepos / ra_priv->data_size;
dp->pos = demuxer->filepos; // all equal
- dp->flags = x ? 0 : 0x10; // Mark first packet as keyframe
+ dp->keyframe = !x; // Mark first packet as keyframe
ds_add_packet(ds, dp);
}
} else {
@@ -148,7 +148,6 @@ static int demux_ra_fill_buffer(demuxer_t *demuxer, demux_stream_t *dsds)
dp->pts = demuxer->filepos / ra_priv->data_size;
dp->pos = demuxer->filepos;
- dp->flags = 0;
ds_add_packet(ds, dp);
}
diff --git a/libmpdemux/demux_ts.c b/libmpdemux/demux_ts.c
index 15c2613dc6..dbf12b7456 100644
--- a/libmpdemux/demux_ts.c
+++ b/libmpdemux/demux_ts.c
@@ -3132,7 +3132,7 @@ static int ts_parse(demuxer_t *demuxer , ES_stream_t *es, unsigned char *packet,
}
memmove(p, es->start, es->size);
*dp_offset += es->size;
- (*dp)->flags = 0;
+ (*dp)->keyframe = 0;
(*dp)->pos = stream_tell(demuxer->stream);
(*dp)->pts = es->pts;
// subtitle packets must be returned immediately if possible
diff --git a/libmpdemux/demux_ty.c b/libmpdemux/demux_ty.c
index 7664eddc98..cc9bb8f902 100644
--- a/libmpdemux/demux_ty.c
+++ b/libmpdemux/demux_ty.c
@@ -294,7 +294,6 @@ static void demux_ty_CopyToDemuxPacket( demux_stream_t *ds,
if (pts != MP_NOPTS_VALUE)
dp->pts = pts / 90000.0;
dp->pos = pos;
- dp->flags = 0;
ds_add_packet( ds, dp );
}
diff --git a/libmpdemux/demux_y4m.c b/libmpdemux/demux_y4m.c
index d1b6749820..cf0f7cf7e6 100644
--- a/libmpdemux/demux_y4m.c
+++ b/libmpdemux/demux_y4m.c
@@ -141,7 +141,6 @@ static int demux_y4m_fill_buffer(demuxer_t *demux, demux_stream_t *dsds) {
dp->pts=(float)priv->framenum/((sh_video_t*)ds->sh)->fps;
priv->framenum++;
dp->pos=demux->filepos;
- dp->flags=0;
ds_add_packet(ds, dp);
return 1;
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index f8309b9f49..ea8c4e01f1 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -187,7 +187,7 @@ static struct demux_packet *create_packet(size_t len)
dp->duration = -1;
dp->stream_pts = MP_NOPTS_VALUE;
dp->pos = 0;
- dp->flags = 0;
+ dp->keyframe = false;
dp->refcount = 1;
dp->master = NULL;
dp->buffer = NULL;
@@ -601,14 +601,14 @@ void ds_clear_parser(demux_stream_t *ds)
}
void ds_read_packet(demux_stream_t *ds, stream_t *stream, int len,
- double pts, off_t pos, int flags)
+ double pts, off_t pos, bool keyframe)
{
demux_packet_t *dp = new_demux_packet(len);
len = stream_read(stream, dp->buffer, len);
resize_demux_packet(dp, len);
dp->pts = pts;
dp->pos = pos;
- dp->flags = flags;
+ dp->keyframe = keyframe;
// append packet to DS stream:
ds_add_packet(ds, dp);
}
@@ -652,7 +652,7 @@ int ds_fill_buffer(demux_stream_t *ds)
ds->pts_bytes += p->len; // !!!
if (p->stream_pts != MP_NOPTS_VALUE)
demux->stream_pts = p->stream_pts;
- ds->flags = p->flags;
+ ds->keyframe = p->keyframe;
// unlink packet:
ds->bytes -= p->len;
ds->current = p;
@@ -1000,11 +1000,8 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts,
if (!desc)
// should only happen with obsolete -demuxer 99 numeric format
return NULL;
- demuxer = open_given_type(opts, desc, stream, force, audio_id,
- video_id, sub_id, filename, params);
- if (demuxer)
- goto dmx_open;
- return NULL;
+ return open_given_type(opts, desc, stream, force, audio_id,
+ video_id, sub_id, filename, params);
}
// Test demuxers with safe file checks
@@ -1013,7 +1010,7 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts,
demuxer = open_given_type(opts, desc, stream, false, audio_id,
video_id, sub_id, filename, params);
if (demuxer)
- goto dmx_open;
+ return demuxer;
}
}
@@ -1026,7 +1023,7 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts,
demuxer = open_given_type(opts, desc, stream, false, audio_id,
video_id, sub_id, filename, params);
if (demuxer)
- goto dmx_open;
+ return demuxer;
}
// Finally try detection for demuxers with unsafe checks
@@ -1035,28 +1032,11 @@ static struct demuxer *demux_open_stream(struct MPOpts *opts,
demuxer = open_given_type(opts, desc, stream, false, audio_id,
video_id, sub_id, filename, params);
if (demuxer)
- goto dmx_open;
+ return demuxer;
}
}
return NULL;
-
- dmx_open:
-
- if (demuxer->type == DEMUXER_TYPE_PLAYLIST)
- return demuxer;
-
- struct sh_video *sh_video = demuxer->video->sh;
- if (sh_video && sh_video->bih) {
- int biComp = le2me_32(sh_video->bih->biCompression);
- mp_msg(MSGT_DEMUX, MSGL_INFO,
- "VIDEO: [%.4s] %dx%d %dbpp %5.3f fps %5.1f kbps (%4.1f kbyte/s)\n",
- (char *) &biComp, sh_video->bih->biWidth,
- sh_video->bih->biHeight, sh_video->bih->biBitCount,
- sh_video->fps, sh_video->i_bps * 0.008f,
- sh_video->i_bps / 1024.0f);
- }
- return demuxer;
}
struct demuxer *demux_open(struct MPOpts *opts, stream_t *vs, int file_format,
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index da751852d8..03b1fee830 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -136,7 +136,7 @@ typedef struct demux_stream {
off_t pos; // position in the input stream (file)
off_t dpos; // position in the demuxed stream
int pack_no; // serial number of packet
- int flags; // flags of current packet (keyframe etc)
+ bool keyframe; // keyframe flag of current packet
int non_interleaved; // 1 if this stream is not properly interleaved,
// so e.g. subtitle handling must do explicit reads.
//---------------
@@ -316,7 +316,7 @@ void free_demuxer(struct demuxer *demuxer);
void ds_add_packet(struct demux_stream *ds, struct demux_packet *dp);
void ds_read_packet(struct demux_stream *ds, struct stream *stream, int len,
- double pts, off_t pos, int flags);
+ double pts, off_t pos, bool keyframe);
int demux_fill_buffer(struct demuxer *demux, struct demux_stream *ds);
int ds_fill_buffer(struct demux_stream *ds);
diff --git a/libmpdemux/ebml_defs.c b/libmpdemux/