av_assert0((frame->private_ref && frame->private_ref->size == sizeof(FrameDecodeData)) ||
!(avctx->codec->capabilities & AV_CODEC_CAP_DR1));
+ if (frame->private_ref) {
+ FrameDecodeData *fdd = (FrameDecodeData*)frame->private_ref->data;
+
+ if (fdd->post_process) {
+ ret = fdd->post_process(avctx, frame);
+ if (ret < 0) {
+ av_frame_unref(frame);
+ return ret;
+ }
+ }
+ }
+
av_buffer_unref(&frame->private_ref);
}
return fmt[0];
}
-static AVHWAccel *find_hwaccel(enum AVCodecID codec_id,
+static AVHWAccel *find_hwaccel(AVCodecContext *avctx,
enum AVPixelFormat pix_fmt)
{
AVHWAccel *hwaccel = NULL;
+ const AVClass *av_class =
+ (avctx->codec->caps_internal & FF_CODEC_CAP_HWACCEL_REQUIRE_CLASS)
+ ? avctx->codec->priv_class : NULL;
- while ((hwaccel = av_hwaccel_next(hwaccel)))
- if (hwaccel->id == codec_id
+ while ((hwaccel = av_hwaccel_next(hwaccel))) {
+ if (hwaccel->decoder_class == av_class && hwaccel->id == avctx->codec_id
&& hwaccel->pix_fmt == pix_fmt)
return hwaccel;
+ }
return NULL;
}
const enum AVPixelFormat fmt,
const char *name)
{
- AVHWAccel *hwa = find_hwaccel(avctx->codec_id, fmt);
+ AVHWAccel *hwa = find_hwaccel(avctx, fmt);
int ret = 0;
if (!hwa) {
av_log(avctx, AV_LOG_ERROR,
- "Could not find an AVHWAccel for the pixel format: %s",
+ "Could not find an AVHWAccel for the pixel format: %s\n",
name);
return AVERROR(ENOENT);
}
{
FrameDecodeData *fdd = (FrameDecodeData*)data;
+ if (fdd->post_process_opaque_free)
+ fdd->post_process_opaque_free(fdd->post_process_opaque);
+
+ if (fdd->hwaccel_priv_free)
+ fdd->hwaccel_priv_free(fdd->hwaccel_priv);
+
av_freep(&fdd);
}