static int ffmal_copy_frame(AVCodecContext *avctx, AVFrame *frame, MMAL_BUFFER_HEADER_T *buffer) { MMALDecodeContext *ctx = avctx->priv_data; int ret = 0; if (avctx->pix_fmt == AV_PIX_FMT_MMAL) { if (!ctx->pool_out) return AVERROR_UNKNOWN; // format change code failed with OOM previously if ((ret = ff_decode_frame_props(avctx, frame)) < 0) goto done; if ((ret = ffmmal_set_ref(frame, ctx->pool_out, buffer)) < 0) goto done; } else { int w = FFALIGN(avctx->width, 32); int h = FFALIGN(avctx->height, 16); char *ptr; int plane; int i; if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) goto done; ptr = buffer->data + buffer->type->video.offset[0]; for (i = 0; i < avctx->height; i++) memcpy(frame->data[0] + frame->linesize[0] * i, ptr + w * i, avctx->width); ptr += w * h; for (plane = 1; plane < 3; plane++) { for (i = 0; i < avctx->height / 2; i++) memcpy(frame->data[plane] + frame->linesize[plane] * i, ptr + w / 2 * i, (avctx->width + 1) / 2); ptr += w / 2 * h / 2; } } if (buffer->pts != MMAL_TIME_UNKNOWN) { frame->pkt_pts = buffer->pts; frame->pts = buffer->pts; } done: return ret; }
static int ffmal_copy_frame(AVCodecContext *avctx, AVFrame *frame, MMAL_BUFFER_HEADER_T *buffer) { MMALDecodeContext *ctx = avctx->priv_data; int ret = 0; if (avctx->pix_fmt == AV_PIX_FMT_MMAL) { if (!ctx->pool_out) return AVERROR_UNKNOWN; // format change code failed with OOM previously if ((ret = ff_decode_frame_props(avctx, frame)) < 0) goto done; if ((ret = ffmmal_set_ref(frame, ctx->pool_out, buffer)) < 0) goto done; } else { int w = FFALIGN(avctx->width, 32); int h = FFALIGN(avctx->height, 16); uint8_t *src[4]; int linesize[4]; if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) goto done; av_image_fill_arrays(src, linesize, buffer->data + buffer->type->video.offset[0], avctx->pix_fmt, w, h, 1); av_image_copy(frame->data, frame->linesize, src, linesize, avctx->pix_fmt, avctx->width, avctx->height); } frame->pts = buffer->pts == MMAL_TIME_UNKNOWN ? AV_NOPTS_VALUE : buffer->pts; #if FF_API_PKT_PTS FF_DISABLE_DEPRECATION_WARNINGS frame->pkt_pts = frame->pts; FF_ENABLE_DEPRECATION_WARNINGS #endif frame->pkt_dts = AV_NOPTS_VALUE; done: return ret; }