|
|
|
@ -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; |
|
|
|
|