diff options
author | Uoti Urpala <uau@mplayer2.org> | 2012-07-25 00:23:27 +0300 |
---|---|---|
committer | Uoti Urpala <uau@mplayer2.org> | 2012-07-25 01:10:30 +0300 |
commit | 8079f4ff821aa811de449f08dfdba777e8dd0397 (patch) | |
tree | 4f18f58d5e0fafc317e7d5541f5f291db7532d06 /libmpdemux/demux_ogg.c | |
parent | 5f3c3f8c32d20405a2caf7de66aa1ea7f513d4d2 (diff) | |
download | mpv-8079f4ff821aa811de449f08dfdba777e8dd0397.tar.bz2 mpv-8079f4ff821aa811de449f08dfdba777e8dd0397.tar.xz |
demux, vd_ffmpeg: fix demux keyframe flag, set AV_PKT_FLAG_KEY
There was some confusion about the "flags" field in demuxer packets.
Demuxers set it to either 1 or 0x10 to indicate a keyframe (and the
field was not used to indicate anything else). This didn't cause
visible problems because nothing read the value. Replace the "flags"
field with a boolean "keyframe" field. Set AV_PKT_FLAG_KEY based on
this field in packets fed to libavcodec video decoders (looks like PNG
and ZeroCodec are the only ones which depend on values from demuxer;
previously this was hardcoded to true for PNG).
Make demux_mf set the keyframe field in every packet. This matters for
PNG files now that the demuxer flag is forwarded to libavcodec.
Fix logic setting the field in demux_mkv. It had probably not been
updated when adding SimpleBlock support. This probably makes no
difference for any current practical use.
Diffstat (limited to 'libmpdemux/demux_ogg.c')
-rw-r--r-- | libmpdemux/demux_ogg.c | 36 |
1 files changed, 18 insertions, 18 deletions
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; |