mediacodec_force_key_frames.patch (4049B)
1 diff --git a/media/ffvpx/libavcodec/mediacodec_wrapper.c b/media/ffvpx/libavcodec/mediacodec_wrapper.c 2 --- a/media/ffvpx/libavcodec/mediacodec_wrapper.c 3 +++ b/media/ffvpx/libavcodec/mediacodec_wrapper.c 4 @@ -1411,6 +1411,12 @@ fail: 5 return ret; 6 } 7 8 +static int mediacodec_jni_setParameters(FFAMediaCodec *ctx, 9 + const FFAMediaFormat* format_ctx) 10 +{ 11 + return AVERROR_PATCHWELCOME; 12 +} 13 + 14 static int mediacodec_jni_start(FFAMediaCodec* ctx) 15 { 16 int ret = 0; 17 @@ -1807,6 +1813,7 @@ static const FFAMediaCodec media_codec_jni = { 18 .delete = mediacodec_jni_delete, 19 20 .configure = mediacodec_jni_configure, 21 + .setParameters = mediacodec_jni_setParameters, 22 .start = mediacodec_jni_start, 23 .stop = mediacodec_jni_stop, 24 .flush = mediacodec_jni_flush, 25 @@ -2225,6 +2232,27 @@ static int mediacodec_ndk_configure(FFAMediaCodec* ctx, 26 return 0; 27 } 28 29 +static int mediacodec_ndk_setParameters(FFAMediaCodec *ctx, 30 + const FFAMediaFormat* format_ctx) 31 +{ 32 + FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx; 33 + FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)format_ctx; 34 + media_status_t status; 35 + 36 + if (format_ctx->class != &amediaformat_ndk_class) { 37 + av_log(ctx, AV_LOG_ERROR, "invalid media format\n"); 38 + return AVERROR(EINVAL); 39 + } 40 + 41 + status = AMediaCodec_setParameters(codec->impl, format->impl); 42 + if (status != AMEDIA_OK) { 43 + av_log(codec, AV_LOG_ERROR, "setParameters failed, %d\n", status); 44 + return AVERROR_EXTERNAL; 45 + } 46 + 47 + return 0; 48 +} 49 + 50 #define MEDIACODEC_NDK_WRAPPER(method) \ 51 static int mediacodec_ndk_ ## method(FFAMediaCodec* ctx) \ 52 { \ 53 @@ -2512,6 +2540,7 @@ static const FFAMediaCodec media_codec_ndk = { 54 .delete = mediacodec_ndk_delete, 55 56 .configure = mediacodec_ndk_configure, 57 + .setParameters = mediacodec_ndk_setParameters, 58 .start = mediacodec_ndk_start, 59 .stop = mediacodec_ndk_stop, 60 .flush = mediacodec_ndk_flush, 61 diff --git a/media/ffvpx/libavcodec/mediacodec_wrapper.h b/media/ffvpx/libavcodec/mediacodec_wrapper.h 62 --- a/media/ffvpx/libavcodec/mediacodec_wrapper.h 63 +++ b/media/ffvpx/libavcodec/mediacodec_wrapper.h 64 @@ -205,6 +205,7 @@ struct FFAMediaCodec { 65 int (*delete)(FFAMediaCodec* codec); 66 67 int (*configure)(FFAMediaCodec* codec, const FFAMediaFormat* format, FFANativeWindow* surface, void *crypto, uint32_t flags); 68 + int (*setParameters)(FFAMediaCodec* codec, const FFAMediaFormat* format); 69 int (*start)(FFAMediaCodec* codec); 70 int (*stop)(FFAMediaCodec* codec); 71 int (*flush)(FFAMediaCodec* codec); 72 @@ -260,6 +261,12 @@ static inline int ff_AMediaCodec_configure(FFAMediaCodec *codec, 73 return codec->configure(codec, format, surface, crypto, flags); 74 } 75 76 +static inline int ff_AMediaCodec_setParameters(FFAMediaCodec *codec, 77 + const FFAMediaFormat *format) 78 +{ 79 + return codec->setParameters(codec, format); 80 +} 81 + 82 static inline int ff_AMediaCodec_start(FFAMediaCodec* codec) 83 { 84 return codec->start(codec); 85 diff --git a/media/ffvpx/libavcodec/mediacodecenc.c b/media/ffvpx/libavcodec/mediacodecenc.c 86 --- a/media/ffvpx/libavcodec/mediacodecenc.c 87 +++ b/media/ffvpx/libavcodec/mediacodecenc.c 88 @@ -785,6 +785,13 @@ static int mediacodec_send(AVCodecContext *avctx, 89 copy_frame_to_buffer(avctx, frame, input_buf, input_size); 90 91 pts = av_rescale_q(frame->pts, avctx->time_base, AV_TIME_BASE_Q); 92 + 93 + if (frame->pict_type == AV_PICTURE_TYPE_I) { 94 + FFAMediaFormat *format = ff_AMediaFormat_new(s->use_ndk_codec); 95 + ff_AMediaFormat_setInt32(format, "request-sync", 0); 96 + ff_AMediaCodec_setParameters(codec, format); 97 + ff_AMediaFormat_delete(format); 98 + } 99 } else { 100 flags |= ff_AMediaCodec_getBufferFlagEndOfStream(codec); 101 s->eof_sent = 1;