player: move code for skipping 0-sized video packets to demuxer

These packets have to be explicitly dropped, because usually libavcodec
uses 0-sized packets to flush delayed frames, meaning just passing
through these packets would have bad consequences.

Normally, libavformat doesn't output 0-sized packets anyway. But I don't
want to take any chances, so don't delete it, and just move it out of
the way to demux.c.
This commit is contained in:
wm4 2013-11-26 01:07:14 +01:00
parent 49f076d86d
commit fe73b14eb1
2 changed files with 9 additions and 10 deletions

View File

@ -318,6 +318,14 @@ int demuxer_add_packet(demuxer_t *demuxer, struct sh_stream *stream,
return 0;
}
if (stream->type == STREAM_VIDEO && !dp->len) {
/* Video packets with size 0 are assumed to not correspond to frames,
* but to indicate the absence of a frame in formats like AVI
* that must have packets at fixed timestamp intervals. */
talloc_free(dp);
return 1;
}
dp->stream = stream->index;
dp->next = NULL;

View File

@ -295,16 +295,7 @@ double update_video(struct MPContext *mpctx, double endpts)
while (1) {
if (load_next_vo_frame(mpctx, false))
break;
struct demux_packet *pkt = NULL;
while (1) {
pkt = demux_read_packet(d_video->header);
if (!pkt || pkt->len)
break;
/* Packets with size 0 are assumed to not correspond to frames,
* but to indicate the absence of a frame in formats like AVI
* that must have packets at fixed timecode intervals. */
talloc_free(pkt);
}
struct demux_packet *pkt = demux_read_packet(d_video->header);
if (pkt && pkt->pts != MP_NOPTS_VALUE)
pkt->pts += mpctx->video_offset;
if (pkt && pkt->pts >= mpctx->hrseek_pts - .005)