demux_lavf: "support" mov edit lists and log errors if used

FFmpeg recently got "support" for mov edit lists. This is a terrible
hack that will fail completely at least with some decoders (in
particular wrappers for hardware decoding might be affected). As such it
makes no point to pretend they are supported, even if we assume that the
"intended" functionality works, that there are no implementation bugs
(good luck with all that messy code added to the already huge mov
demuxer), and that it covers enough of the mov edit list feature to be
of value.

So log an error if the FFmpeg code for mov edit lists appears to be
active - AV_PKT_FLAG_DISCARD is used only for "clipping" edit list
segments on non-key frame boundaries.

In the first place, FFmpeg committed this only because Google wanted it
in, and patch review did not even pick up obvious issues. (Just look how
there was no lavc version bump when AV_PKT_FLAG_DISCARD was added.)

We still pass the new packet flag to the decoders (av_common.c change),
which means we "support" FFmpeg's edit list code now. (Until it breaks
due to FFmpeg not caring about all the details.)
This commit is contained in:
wm4 2016-10-18 16:56:50 +02:00
parent 912d668ea8
commit b86a2316df
2 changed files with 5 additions and 0 deletions

View File

@ -160,6 +160,7 @@ void mp_set_av_packet(AVPacket *dst, struct demux_packet *mpkt, AVRational *tb)
dst->side_data_elems = mpkt->avpacket->side_data_elems; dst->side_data_elems = mpkt->avpacket->side_data_elems;
if (dst->data == mpkt->avpacket->data) if (dst->data == mpkt->avpacket->data)
dst->buf = mpkt->avpacket->buf; dst->buf = mpkt->avpacket->buf;
dst->flags |= mpkt->avpacket->flags;
} }
if (mpkt && tb && tb->num > 0 && tb->den > 0) if (mpkt && tb && tb->num > 0 && tb->den > 0)
dst->duration = mpkt->duration / av_q2d(*tb); dst->duration = mpkt->duration / av_q2d(*tb);

View File

@ -938,6 +938,10 @@ static int demux_lavf_fill_buffer(demuxer_t *demux)
#endif #endif
dp->pos = pkt->pos; dp->pos = pkt->pos;
dp->keyframe = pkt->flags & AV_PKT_FLAG_KEY; dp->keyframe = pkt->flags & AV_PKT_FLAG_KEY;
#if LIBAVFORMAT_VERSION_INT >= AV_VERSION_INT(57, 50, 100)
if (pkt->flags & AV_PKT_FLAG_DISCARD)
MP_ERR(demux, "Edit lists are not correctly supported (FFmpeg issue).\n");
#endif
av_packet_unref(pkt); av_packet_unref(pkt);
if (priv->format_hack.clear_filepos) if (priv->format_hack.clear_filepos)