1
mirror of https://github.com/mpv-player/mpv synced 2024-08-04 14:59:58 +02:00

vd_ffmpeg: fix flushing of buffered frames

The vd_ffmpeg decode() function returned without doing anything if the
input packet had size 0. This meant that flushing buffered frames at
EOF did not work. Remove this test. Have the core code skip such
packets coming from the file being played instead (Libav treats
0-sized packets as flush signals anyway, so better assume such packets
do not represent real frames with any codec).
This commit is contained in:
Uoti Urpala 2012-02-03 20:09:48 +02:00
parent b317b92819
commit da52c9400d
2 changed files with 12 additions and 5 deletions

View File

@ -610,9 +610,6 @@ static struct mp_image *decode(struct sh_video *sh, struct demux_packet *packet,
int dr1 = ctx->do_dr1;
AVPacket pkt;
if (len <= 0)
return NULL; // skipped frame
if (!dr1)
avctx->draw_horiz_band = NULL;

View File

@ -2804,7 +2804,9 @@ static double update_video_nocorrect_pts(struct MPContext *mpctx)
frame_time = sh_video->next_frame_time;
if (mpctx->restart_playback)
frame_time = 0;
int in_size = video_read_frame(sh_video, &sh_video->next_frame_time,
int in_size = 0;
while (!in_size)
in_size = video_read_frame(sh_video, &sh_video->next_frame_time,
&packet, force_fps);
if (in_size < 0) {
#ifdef CONFIG_DVDNAV
@ -2903,7 +2905,15 @@ static double update_video(struct MPContext *mpctx)
int in_size = 0;
unsigned char *buf = NULL;
pts = MP_NOPTS_VALUE;
struct demux_packet *pkt = ds_get_packet2(mpctx->d_video, false);
struct demux_packet *pkt;
while (1) {
pkt = ds_get_packet2(mpctx->d_video, false);
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. */
}
if (pkt) {
in_size = pkt->len;
buf = pkt->buffer;