From bc6eca53e811b755719ead53042eef5654e73d93 Mon Sep 17 00:00:00 2001 From: xufulong Date: Thu, 24 Feb 2022 21:17:20 +0800 Subject: [PATCH] change to avcodec_send_packet()/avcodec_receive_frame() --- .../cpp/metadata/ffmpeg_media_retriever.c | 58 ++++++++++--------- 1 file changed, 30 insertions(+), 28 deletions(-) diff --git a/app/src/main/cpp/metadata/ffmpeg_media_retriever.c b/app/src/main/cpp/metadata/ffmpeg_media_retriever.c index 3488c3c..fb9e231 100755 --- a/app/src/main/cpp/metadata/ffmpeg_media_retriever.c +++ b/app/src/main/cpp/metadata/ffmpeg_media_retriever.c @@ -146,7 +146,7 @@ int stream_component_open(State *s, int stream_index) { return SUCCESS; } -int set_data_source_l(State **state_ptr, const char* path) { +int set_data_source_inner(State **state_ptr, const char* path) { int i; int audio_index = -1; int video_index = -1; @@ -161,13 +161,13 @@ int set_data_source_l(State **state_ptr, const char* path) { } if (avformat_open_input(&state->pFormatCtx, path, NULL, &options) != 0) { - LOGE("Metadata could not be retrieved\n"); + LOGE("avformat_open_input fail..."); *state_ptr = NULL; return FAILURE; } if (avformat_find_stream_info(state->pFormatCtx, NULL) < 0) { - LOGE("Metadata could not be retrieved\n"); + LOGE("avformat_find_stream_info fail..."); avformat_close_input(&state->pFormatCtx); *state_ptr = NULL; return FAILURE; @@ -245,7 +245,7 @@ int set_data_source(State **state_ptr, const char* path) { state->native_window = native_window; *state_ptr = state; - return set_data_source_l(state_ptr, path); + return set_data_source_inner(state_ptr, path); } int set_data_source_fd(State **state_ptr, int fd, int64_t offset, int64_t length) { @@ -266,7 +266,7 @@ int set_data_source_fd(State **state_ptr, int fd, int64_t offset, int64_t length state->offset = offset; *state_ptr = state; - return set_data_source_l(state_ptr, path); + return set_data_source_inner(state_ptr, path); } const char* extract_metadata(State **state_ptr, const char* key) { @@ -357,7 +357,7 @@ int init_ffmpeg_filters(State *state, const char *filters_descr, AVFormatContext state->buffersink_ctx = buffersink_ctx; state->filter_graph = filter_graph; - end: +end: avfilter_inout_free(&inputs); avfilter_inout_free(&outputs); @@ -453,7 +453,9 @@ void convert_image(State *state, AVCodecContext *pCodecCtx, AVFrame *pFrame, AVP } } - int ret = avcodec_encode_video2(codecCtx, avpkt, frame, got_packet_ptr); + avcodec_send_frame(codecCtx, frame); + int ret = avcodec_receive_packet(codecCtx, avpkt); + *got_packet_ptr = (ret == 0 ? 1 : 0); if (rotateDegree == 90 || rotateDegree == 270) { codecCtx->width = frame->height; @@ -475,9 +477,6 @@ void convert_image(State *state, AVCodecContext *pCodecCtx, AVFrame *pFrame, AVP } } - if (ret < 0) { - *got_packet_ptr = 0; - } av_frame_free(&frame); if (buffer) { free(buffer); @@ -521,8 +520,12 @@ int get_embedded_picture(State **state_ptr, AVPacket *pkt) { break; } - if (avcodec_decode_video2(state->video_st->codec, frame, &got_frame, pkt) <= 0) { - break; + avcodec_send_packet(state->video_st->codec, pkt); + int ret = avcodec_receive_frame(state->video_st->codec, frame); + if (ret == 0) { + got_frame = 1; + } else { + break; } if (got_frame) { @@ -536,7 +539,6 @@ int get_embedded_picture(State **state_ptr, AVPacket *pkt) { av_packet_unref(pkt); av_init_packet(pkt); av_packet_ref(pkt, &convertedPkt); - av_packet_unref(&convertedPkt); break; @@ -563,7 +565,6 @@ int get_embedded_picture(State **state_ptr, AVPacket *pkt) { } void decode_frame(State *state, AVPacket *pkt, int *got_frame, int64_t desired_frame_number, int width, int height) { - *got_frame = 0; AVFrame *frame = av_frame_alloc(); if (!frame) { return; @@ -578,22 +579,23 @@ void decode_frame(State *state, AVPacket *pkt, int *got_frame, int64_t desired_f if (!is_supported_format(codec_id, pix_fmt)) { *got_frame = 0; - if (avcodec_decode_video2(state->video_st->codec, frame, got_frame, pkt) <= 0) { - *got_frame = 0; - break; + avcodec_send_packet(state->video_st->codec, pkt); + int ret = avcodec_receive_frame(state->video_st->codec, frame); + if (ret == 0) { + *got_frame = 1; + } else { + break; } - if (*got_frame) { - if (desired_frame_number == -1 || - (desired_frame_number != -1 && frame->pts >= desired_frame_number)) { - if (pkt->data) { - av_packet_unref(pkt); - } - av_init_packet(pkt); - convert_image(state, state->video_st->codec, frame, pkt, got_frame, width, height); - break; - } - } + if (desired_frame_number == -1 || + (desired_frame_number != -1 && frame->pts >= desired_frame_number)) { + if (pkt->data) { + av_packet_unref(pkt); + } + av_init_packet(pkt); + convert_image(state, state->video_st->codec, frame, pkt, got_frame, width, height); + break; + } } else { *got_frame = 1; break;