video: allow the decoder to consume packets partially

This is in preparation for a hypothetical API change in libavcodec,
which would allow the decoder to return multiple video frames before
accepting a new input packet.

In theory, the body of the if() added to vd_lavc.c could be replaced
with this code:

    packet->buffer += ret;
    packet->len    -= ret;

but currently this is not needed, as libavformat already outputs one
frame per packet. Also, using libavcodec this way could lead to a
"deadlock" if the decoder refuses to consume e.g. garbage padding, so
enabling this now would introduce bugs.

(Adding this now for easier testing, and for symmetry with the audio
code.)
This commit is contained in:
wm4 2016-02-19 18:35:11 +01:00
parent b3804e71af
commit 6640b22a8c
2 changed files with 9 additions and 2 deletions

View File

@ -412,8 +412,10 @@ void video_work(struct dec_video *d_video)
framedrop_type = 2;
}
d_video->current_mpi = decode_packet(d_video, d_video->packet, framedrop_type);
talloc_free(d_video->packet); // always fully consumed
d_video->packet = NULL;
if (d_video->packet && d_video->packet->len == 0) {
talloc_free(d_video->packet);
d_video->packet = NULL;
}
d_video->current_state = DATA_OK;
if (!d_video->current_mpi) {

View File

@ -702,6 +702,11 @@ static void decode(struct dec_video *vd, struct demux_packet *packet,
return;
}
if (packet) {
// always fully consumed
packet->len = 0;
}
// Skipped frame, or delayed output due to multithreaded decoding.
if (!got_picture) {
if (!packet)