|
|
|
@ -40,6 +40,9 @@ |
|
|
|
|
typedef struct Libdav1dContext { |
|
|
|
|
AVClass *class; |
|
|
|
|
Dav1dContext *c; |
|
|
|
|
/* This packet coincides with AVCodecInternal.in_pkt
|
|
|
|
|
* and is not owned by us. */ |
|
|
|
|
AVPacket *pkt; |
|
|
|
|
AVBufferPool *pool; |
|
|
|
|
int pool_size; |
|
|
|
|
|
|
|
|
@ -214,6 +217,8 @@ static av_cold int libdav1d_init(AVCodecContext *c) |
|
|
|
|
#endif |
|
|
|
|
int res; |
|
|
|
|
|
|
|
|
|
dav1d->pkt = c->internal->in_pkt; |
|
|
|
|
|
|
|
|
|
av_log(c, AV_LOG_INFO, "libdav1d %s\n", dav1d_version()); |
|
|
|
|
|
|
|
|
|
dav1d_default_settings(&s); |
|
|
|
@ -292,25 +297,26 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) |
|
|
|
|
int res; |
|
|
|
|
|
|
|
|
|
if (!data->sz) { |
|
|
|
|
AVPacket pkt = { 0 }; |
|
|
|
|
AVPacket *const pkt = dav1d->pkt; |
|
|
|
|
|
|
|
|
|
res = ff_decode_get_packet(c, &pkt); |
|
|
|
|
res = ff_decode_get_packet(c, pkt); |
|
|
|
|
if (res < 0 && res != AVERROR_EOF) |
|
|
|
|
return res; |
|
|
|
|
|
|
|
|
|
if (pkt.size) { |
|
|
|
|
res = dav1d_data_wrap(data, pkt.data, pkt.size, libdav1d_data_free, pkt.buf); |
|
|
|
|
if (pkt->size) { |
|
|
|
|
res = dav1d_data_wrap(data, pkt->data, pkt->size, |
|
|
|
|
libdav1d_data_free, pkt->buf); |
|
|
|
|
if (res < 0) { |
|
|
|
|
av_packet_unref(&pkt); |
|
|
|
|
av_packet_unref(pkt); |
|
|
|
|
return res; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
data->m.timestamp = pkt.pts; |
|
|
|
|
data->m.offset = pkt.pos; |
|
|
|
|
data->m.duration = pkt.duration; |
|
|
|
|
data->m.timestamp = pkt->pts; |
|
|
|
|
data->m.offset = pkt->pos; |
|
|
|
|
data->m.duration = pkt->duration; |
|
|
|
|
|
|
|
|
|
pkt.buf = NULL; |
|
|
|
|
av_packet_unref(&pkt); |
|
|
|
|
pkt->buf = NULL; |
|
|
|
|
av_packet_unref(pkt); |
|
|
|
|
|
|
|
|
|
if (c->reordered_opaque != AV_NOPTS_VALUE) { |
|
|
|
|
uint8_t *reordered_opaque = av_malloc(sizeof(c->reordered_opaque)); |
|
|
|
@ -329,7 +335,7 @@ static int libdav1d_receive_frame(AVCodecContext *c, AVFrame *frame) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else if (res >= 0) { |
|
|
|
|
av_packet_unref(&pkt); |
|
|
|
|
av_packet_unref(pkt); |
|
|
|
|
return AVERROR(EAGAIN); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|