[FFmpeg-devel] [PATCH 1/2] Add an OpenH264 decoder wrapper
Michael Niedermayer
michael at niedermayer.cc
Tue Jul 26 18:47:12 EEST 2016
On Tue, Jul 26, 2016 at 03:41:52PM +0300, Martin Storsjö wrote:
[...]
> +static int svc_decode_frame(AVCodecContext *avctx, void *data,
> + int *got_frame, AVPacket *avpkt)
> +{
> + SVCContext *s = avctx->priv_data;
> + SBufferInfo info = { 0 };
> + uint8_t* ptrs[3];
> + int linesize[3];
> + AVFrame *avframe = data;
> + int ret;
> + DECODING_STATE state;
> +
> + if ((ret = init_bsf(avctx)) < 0)
> + return ret;
> +
> + if (avpkt->size) {
> + AVPacket input_ref = { 0 };
> + if (av_fifo_space(s->packet_fifo) < sizeof(input_ref)) {
> + ret = av_fifo_realloc2(s->packet_fifo,
> + av_fifo_size(s->packet_fifo) + sizeof(input_ref));
> + if (ret < 0)
> + return ret;
> + }
> +
> + ret = av_packet_ref(&input_ref, avpkt);
> + if (ret < 0)
> + return ret;
> + av_fifo_generic_write(s->packet_fifo, &input_ref, sizeof(input_ref), NULL);
> + }
> +
> + while (!*got_frame) {
> + /* prepare the input data -- convert to Annex B if needed */
> + if (s->pkt_filtered.size <= 0) {
> + AVPacket input_ref;
> +
> + /* no more data */
> + if (av_fifo_size(s->packet_fifo) < sizeof(AVPacket))
> + return avpkt->size ? avpkt->size : 0;
> +
> + av_packet_unref(&s->pkt_filtered);
> +
> + av_fifo_generic_read(s->packet_fifo, &input_ref, sizeof(input_ref), NULL);
> + ret = av_bsf_send_packet(s->bsf, &input_ref);
> + if (ret < 0) {
> + av_packet_unref(&input_ref);
> + return ret;
> + }
> +
> + ret = av_bsf_receive_packet(s->bsf, &s->pkt_filtered);
> + if (ret < 0)
> + av_packet_move_ref(&s->pkt_filtered, &input_ref);
> + else
> + av_packet_unref(&input_ref);
> + }
> +
> + state = (*s->decoder)->DecodeFrame2(s->decoder, s->pkt_filtered.data, s->pkt_filtered.size, ptrs, &info);
> + s->pkt_filtered.size = 0;
> + if (state != dsErrorFree) {
> + av_log(avctx, AV_LOG_ERROR, "DecodeFrame2 failed\n");
> + return AVERROR_UNKNOWN;
> + }
> + if (info.iBufferStatus != 1) {
> + av_log(avctx, AV_LOG_DEBUG, "No frame produced\n");
> + continue;
> + }
> +
> + ff_set_dimensions(avctx, info.UsrData.sSystemBuffer.iWidth, info.UsrData.sSystemBuffer.iHeight);
The return code should be checked
(its checked in all other cases in our codebase except some "0,0"
calls IIRC)
> + // The decoder doesn't (currently) support decoding into a user
> + // provided buffer, so do a copy instead.
> + if (ff_get_buffer(avctx, avframe, 0) < 0) {
> + av_log(avctx, AV_LOG_ERROR, "Unable to allocate buffer\n");
> + return AVERROR(ENOMEM);
> + }
> +
> + linesize[0] = info.UsrData.sSystemBuffer.iStride[0];
> + linesize[1] = linesize[2] = info.UsrData.sSystemBuffer.iStride[1];
> + av_image_copy(avframe->data, avframe->linesize, (const uint8_t **) ptrs, linesize, avctx->pix_fmt, avctx->width, avctx->height);
> +
> + avframe->pts = s->pkt_filtered.pts;
> + avframe->pkt_dts = s->pkt_filtered.dts;
> +#if FF_API_PKT_PTS
> +FF_DISABLE_DEPRECATION_WARNINGS
> + avframe->pkt_pts = s->pkt_filtered.pts;
> +FF_ENABLE_DEPRECATION_WARNINGS
> +#endif
this produces a warning:
libavcodec/libopenh264dec.c:222:5: warning: "FF_API_PKT_PTS" is not defined [-Wundef]
thanks
[...]
--
Michael GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB
I have never wished to cater to the crowd; for what I know they do not
approve, and what they approve I do not know. -- Epicurus
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: Digital signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20160726/da574dde/attachment.sig>
More information about the ffmpeg-devel
mailing list