diff --git a/src/plugins/thumbnailffmpeg_extractor.c b/src/plugins/thumbnailffmpeg_extractor.c index ef7a05f..f2c5c94 100644 --- a/src/plugins/thumbnailffmpeg_extractor.c +++ b/src/plugins/thumbnailffmpeg_extractor.c @@ -181,7 +181,7 @@ create_thumbnail (AVCodecContext *pCodecCtx, int src_width, int src_height, { AVCodecContext *encoder_codec_ctx; AVDictionary *opts; - AVCodec *encoder_codec; + const AVCodec *encoder_codec; struct SwsContext *scaler_ctx; AVFrame *dst_frame; uint8_t *dst_buffer; @@ -332,12 +332,12 @@ create_thumbnail (AVCodecContext *pCodecCtx, int src_width, int src_height, dst_frame->quality = encoder_codec_ctx->global_quality; #endif - err = avcodec_encode_video2 (encoder_codec_ctx, - &pkt, - dst_frame, &gotPacket); - + err = avcodec_send_frame(encoder_codec_ctx, dst_frame); if (err < 0) goto cleanup; + err = avcodec_receive_packet(encoder_codec_ctx, &pkt); + if (err < 0 && err != AVERROR(EAGAIN)) + goto cleanup; err = pkt.size; memcpy (encoder_output_buffer,pkt.data, pkt.size); @@ -417,7 +417,7 @@ extract_image (ENUM_CODEC_ID image_codec_id, { AVDictionary *opts; AVCodecContext *codec_ctx; - AVCodec *codec; + const AVCodec *codec; AVPacket avpkt; AVFrame *frame; uint8_t *encoded_thumbnail; @@ -480,7 +480,14 @@ extract_image (ENUM_CODEC_ID image_codec_id, av_init_packet (&avpkt); avpkt.data = padded_data; avpkt.size = iret; - avcodec_decode_video2 (codec_ctx, frame, &frame_finished, &avpkt); + int ret = avcodec_send_packet(codec_ctx, &avpkt); + if (ret < 0) + break; + ret = avcodec_receive_frame(codec_ctx, frame); + if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) + break; + if (ret >= 0) + frame_finished = 1; } if (! frame_finished) { @@ -553,7 +560,7 @@ extract_video (struct EXTRACTOR_ExtractContext *ec) struct AVFormatContext *format_ctx; AVCodecContext *codec_ctx; AVCodecParameters *codecpar; - AVCodec *codec; + const AVCodec *codec; AVDictionary *options; AVFrame *frame; uint8_t *encoded_thumbnail; @@ -607,7 +614,8 @@ extract_video (struct EXTRACTOR_ExtractContext *ec) for (i = 0; inb_streams; i++) { codecpar = format_ctx->streams[i]->codecpar; - codec_ctx = format_ctx->streams[i]->codec; + codec_ctx = avcodec_alloc_context3(avcodec_find_decoder(codecpar->codec_id)); + avcodec_parameters_to_context(codec_ctx, codecpar); if (AVMEDIA_TYPE_VIDEO != codec_ctx->codec_type) continue; if (NULL == (codec = avcodec_find_decoder (codecpar->codec_id))) @@ -682,10 +690,14 @@ extract_video (struct EXTRACTOR_ExtractContext *ec) break; if (packet.stream_index == video_stream_index) { - avcodec_decode_video2 (codec_ctx, - frame, - &frame_finished, - &packet); + int ret = avcodec_send_packet(codec_ctx, &packet); + if (ret < 0) + break; + ret = avcodec_receive_frame(codec_ctx, frame); + if (ret < 0 && ret != AVERROR(EAGAIN) && ret != AVERROR_EOF) + break; + if (ret >= 0) + frame_finished = 1; if (frame_finished && frame->key_frame) { av_packet_unref (&packet);