return allocate_buffers(s); return 0; } static av_cold int flac_decode_close(AVCodecContext *avctx) { FLACContext *s = avctx->priv_data; av_freep(&s->decoded_buffer); return 0; } AVCodec ff_flac_decoder = { .name = "flac", .long_name = NULL_IF_CONFIG_SMALL("FLAC (Free Lossless Audio Codec)"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_FLAC, .priv_data_size = sizeof(FLACContext), .init = flac_decode_init, .close = flac_decode_close, .decode = flac_decode_frame, .init_thread_copy = ONLY_IF_THREADS_ENABLED(init_thread_copy), .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S16P, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_S32P, AV_SAMPLE_FMT_NONE }, };
done: opj_image_destroy(image); opj_destroy_decompress(dec); return ret; } static av_cold int libopenjpeg_decode_close(AVCodecContext *avctx) { LibOpenJPEGContext *ctx = avctx->priv_data; if(ctx->image.data[0]) ff_thread_release_buffer(avctx, &ctx->image); return 0 ; } AVCodec ff_libopenjpeg_decoder = { .name = "libopenjpeg", .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_JPEG2000, .priv_data_size = sizeof(LibOpenJPEGContext), .init = libopenjpeg_decode_init, .close = libopenjpeg_decode_close, .decode = libopenjpeg_decode_frame, .capabilities = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS, .max_lowres = 5, .long_name = NULL_IF_CONFIG_SMALL("OpenJPEG JPEG 2000"), .init_thread_copy = ONLY_IF_THREADS_ENABLED(libopenjpeg_decode_init_thread_copy), };