Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH 2/8] avcodec/mediacodec_wrapper: link to NDK mediacodec API directly
       [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
@ 2024-04-17  4:37 ` Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 3/8] avcodec/mediacodec_wrapper: Fix unused variable warning Zhao Zhili
                   ` (5 subsequent siblings)
  6 siblings, 0 replies; 7+ messages in thread
From: Zhao Zhili @ 2024-04-17  4:37 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

From: Zhao Zhili <zhilizhao@tencent.com>

Drop support of Android version before 5.0.
---
 configure                       |   2 +-
 libavcodec/mediacodec_wrapper.c | 164 +++++++-------------------------
 2 files changed, 36 insertions(+), 130 deletions(-)

diff --git a/configure b/configure
index 47ec215f8c..d0d0e8430b 100755
--- a/configure
+++ b/configure
@@ -3131,7 +3131,7 @@ d3d11va_deps="dxva_h ID3D11VideoDecoder ID3D11VideoContext"
 d3d12va_deps="dxva_h ID3D12Device ID3D12VideoDecoder"
 dxva2_deps="dxva2api_h DXVA2_ConfigPictureDecode ole32 user32"
 ffnvcodec_deps_any="libdl LoadLibrary"
-mediacodec_deps="android"
+mediacodec_deps="android mediandk"
 nvdec_deps="ffnvcodec"
 vaapi_x11_deps="xlib_x11"
 videotoolbox_hwaccel_deps="videotoolbox pthreads"
diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c
index 306359071e..a9c8b522e0 100644
--- a/libavcodec/mediacodec_wrapper.c
+++ b/libavcodec/mediacodec_wrapper.c
@@ -1828,25 +1828,8 @@ typedef struct FFAMediaFormatNdk {
     void *libmedia;
     AMediaFormat *impl;
 
-    AMediaFormat *(*new)(void);
-    media_status_t (*delete)(AMediaFormat*);
-
-    const char* (*toString)(AMediaFormat*);
-
-    bool (*getInt32)(AMediaFormat*, const char *name, int32_t *out);
-    bool (*getInt64)(AMediaFormat*, const char *name, int64_t *out);
-    bool (*getFloat)(AMediaFormat*, const char *name, float *out);
-    bool (*getSize)(AMediaFormat*, const char *name, size_t *out);
-    bool (*getBuffer)(AMediaFormat*, const char *name, void** data, size_t *size);
-    bool (*getString)(AMediaFormat*, const char *name, const char **out);
     bool (*getRect)(AMediaFormat *, const char *name,
                     int32_t *left, int32_t *top, int32_t *right, int32_t *bottom);
-
-    void (*setInt32)(AMediaFormat*, const char* name, int32_t value);
-    void (*setInt64)(AMediaFormat*, const char* name, int64_t value);
-    void (*setFloat)(AMediaFormat*, const char* name, float value);
-    void (*setString)(AMediaFormat*, const char* name, const char* value);
-    void (*setBuffer)(AMediaFormat*, const char* name, const void* data, size_t size);
     void (*setRect)(AMediaFormat *, const char *name,
                     int32_t left, int32_t top, int32_t right, int32_t bottom);
 } FFAMediaFormatNdk;
@@ -1858,34 +1841,6 @@ typedef struct FFAMediaCodecNdk {
     AMediaCodec *impl;
     ANativeWindow *window;
 
-    AMediaCodec* (*createCodecByName)(const char *name);
-    AMediaCodec* (*createDecoderByType)(const char *mime_type);
-    AMediaCodec* (*createEncoderByType)(const char *mime_type);
-    media_status_t (*delete)(AMediaCodec*);
-
-    media_status_t (*configure)(AMediaCodec *,
-                                const AMediaFormat *format,
-                                ANativeWindow *surface,
-                                AMediaCrypto *crypto,
-                                uint32_t flags);
-    media_status_t (*start)(AMediaCodec*);
-    media_status_t (*stop)(AMediaCodec*);
-    media_status_t (*flush)(AMediaCodec*);
-
-    uint8_t* (*getInputBuffer)(AMediaCodec*, size_t idx, size_t *out_size);
-    uint8_t* (*getOutputBuffer)(AMediaCodec*, size_t idx, size_t *out_size);
-
-    ssize_t (*dequeueInputBuffer)(AMediaCodec*, int64_t timeoutUs);
-    media_status_t (*queueInputBuffer)(AMediaCodec*, size_t idx,
-                                       long offset, size_t size,
-                                       uint64_t time, uint32_t flags);
-
-    ssize_t (*dequeueOutputBuffer)(AMediaCodec*, AMediaCodecBufferInfo *info, int64_t timeoutUs);
-    AMediaFormat* (*getOutputFormat)(AMediaCodec*);
-
-    media_status_t (*releaseOutputBuffer)(AMediaCodec*, size_t idx, bool render);
-    media_status_t (*releaseOutputBufferAtTime)(AMediaCodec *mData, size_t idx, int64_t timestampNs);
-
     // Available since API level 28.
     media_status_t (*getName)(AMediaCodec*, char** out_name);
     void (*releaseName)(AMediaCodec*, char* name);
@@ -1925,38 +1880,15 @@ static FFAMediaFormat *mediaformat_ndk_create(AMediaFormat *impl)
 #define GET_OPTIONAL_SYMBOL(sym) \
     format->sym = dlsym(format->libmedia, "AMediaFormat_" #sym);
 
-#define GET_SYMBOL(sym)         \
-    GET_OPTIONAL_SYMBOL(sym)    \
-    if (!format->sym)           \
-        goto error;
-
-    GET_SYMBOL(new)
-    GET_SYMBOL(delete)
-
-    GET_SYMBOL(toString)
-
-    GET_SYMBOL(getInt32)
-    GET_SYMBOL(getInt64)
-    GET_SYMBOL(getFloat)
-    GET_SYMBOL(getSize)
-    GET_SYMBOL(getBuffer)
-    GET_SYMBOL(getString)
     GET_OPTIONAL_SYMBOL(getRect)
-
-    GET_SYMBOL(setInt32)
-    GET_SYMBOL(setInt64)
-    GET_SYMBOL(setFloat)
-    GET_SYMBOL(setString)
-    GET_SYMBOL(setBuffer)
     GET_OPTIONAL_SYMBOL(setRect)
 
-#undef GET_SYMBOL
 #undef GET_OPTIONAL_SYMBOL
 
     if (impl) {
         format->impl = impl;
     } else {
-        format->impl = format->new();
+        format->impl = AMediaFormat_new();
         if (!format->impl)
             goto error;
     }
@@ -1984,7 +1916,7 @@ static int mediaformat_ndk_delete(FFAMediaFormat* ctx)
 
     av_assert0(format->api.class == &amediaformat_ndk_class);
 
-    if (format->impl && (format->delete(format->impl) != AMEDIA_OK))
+    if (format->impl && (AMediaFormat_delete(format->impl) != AMEDIA_OK))
             ret = AVERROR_EXTERNAL;
     if (format->libmedia)
         dlclose(format->libmedia);
@@ -1996,39 +1928,39 @@ static int mediaformat_ndk_delete(FFAMediaFormat* ctx)
 static char* mediaformat_ndk_toString(FFAMediaFormat* ctx)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    const char *str = format->toString(format->impl);
+    const char *str = AMediaFormat_toString(format->impl);
     return av_strdup(str);
 }
 
 static int mediaformat_ndk_getInt32(FFAMediaFormat* ctx, const char *name, int32_t *out)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    return format->getInt32(format->impl, name, out);
+    return AMediaFormat_getInt32(format->impl, name, out);
 }
 
 static int mediaformat_ndk_getInt64(FFAMediaFormat* ctx, const char *name, int64_t *out)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    return format->getInt64(format->impl, name, out);
+    return AMediaFormat_getInt64(format->impl, name, out);
 }
 
 static int mediaformat_ndk_getFloat(FFAMediaFormat* ctx, const char *name, float *out)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    return format->getFloat(format->impl, name, out);
+    return AMediaFormat_getFloat(format->impl, name, out);
 }
 
 static int mediaformat_ndk_getBuffer(FFAMediaFormat* ctx, const char *name, void** data, size_t *size)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    return format->getBuffer(format->impl, name, data, size);
+    return AMediaFormat_getBuffer(format->impl, name, data, size);
 }
 
 static int mediaformat_ndk_getString(FFAMediaFormat* ctx, const char *name, const char **out)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
     const char *tmp = NULL;
-    int ret = format->getString(format->impl, name, &tmp);
+    int ret = AMediaFormat_getString(format->impl, name, &tmp);
 
     if (tmp)
         *out = av_strdup(tmp);
@@ -2047,31 +1979,31 @@ static int mediaformat_ndk_getRect(FFAMediaFormat *ctx, const char *name,
 static void mediaformat_ndk_setInt32(FFAMediaFormat* ctx, const char* name, int32_t value)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    format->setInt32(format->impl, name, value);
+    AMediaFormat_setInt32(format->impl, name, value);
 }
 
 static void mediaformat_ndk_setInt64(FFAMediaFormat* ctx, const char* name, int64_t value)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    format->setInt64(format->impl, name, value);
+    AMediaFormat_setInt64(format->impl, name, value);
 }
 
 static void mediaformat_ndk_setFloat(FFAMediaFormat* ctx, const char* name, float value)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    format->setFloat(format->impl, name, value);
+    AMediaFormat_setFloat(format->impl, name, value);
 }
 
 static void mediaformat_ndk_setString(FFAMediaFormat* ctx, const char* name, const char* value)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    format->setString(format->impl, name, value);
+    AMediaFormat_setString(format->impl, name, value);
 }
 
 static void mediaformat_ndk_setBuffer(FFAMediaFormat* ctx, const char* name, void* data, size_t size)
 {
     FFAMediaFormatNdk *format = (FFAMediaFormatNdk *)ctx;
-    format->setBuffer(format->impl, name, data, size);
+    AMediaFormat_setBuffer(format->impl, name, data, size);
 }
 
 static void mediaformat_ndk_setRect(FFAMediaFormat *ctx, const char *name,
@@ -2117,54 +2049,28 @@ static inline FFAMediaCodec *ndk_codec_create(int method, const char *arg) {
     if (!codec->libmedia)
         goto error;
 
-#define GET_SYMBOL(sym, required)                                   \
+#define GET_SYMBOL(sym)                                             \
     codec->sym = dlsym(codec->libmedia, "AMediaCodec_" #sym);       \
-    if (!codec->sym) {                                              \
-        av_log(codec, required ? AV_LOG_ERROR : AV_LOG_INFO,        \
-               #sym "() unavailable from %s\n", lib_name);          \
-        if (required)                                               \
-            goto error;                                             \
-    }
-
-    GET_SYMBOL(createCodecByName, 1)
-    GET_SYMBOL(createDecoderByType, 1)
-    GET_SYMBOL(createEncoderByType, 1)
-    GET_SYMBOL(delete, 1)
-
-    GET_SYMBOL(configure, 1)
-    GET_SYMBOL(start, 1)
-    GET_SYMBOL(stop, 1)
-    GET_SYMBOL(flush, 1)
-
-    GET_SYMBOL(getInputBuffer, 1)
-    GET_SYMBOL(getOutputBuffer, 1)
-
-    GET_SYMBOL(dequeueInputBuffer, 1)
-    GET_SYMBOL(queueInputBuffer, 1)
-
-    GET_SYMBOL(dequeueOutputBuffer, 1)
-    GET_SYMBOL(getOutputFormat, 1)
-
-    GET_SYMBOL(releaseOutputBuffer, 1)
-    GET_SYMBOL(releaseOutputBufferAtTime, 1)
+    if (!codec->sym)                                                \
+        av_log(codec, AV_LOG_INFO, #sym "() unavailable from %s\n", lib_name);
 
-    GET_SYMBOL(getName, 0)
-    GET_SYMBOL(releaseName, 0)
+    GET_SYMBOL(getName)
+    GET_SYMBOL(releaseName)
 
-    GET_SYMBOL(setInputSurface, 0)
-    GET_SYMBOL(signalEndOfInputStream, 0)
+    GET_SYMBOL(setInputSurface)
+    GET_SYMBOL(signalEndOfInputStream)
 
 #undef GET_SYMBOL
 
     switch (method) {
     case CREATE_CODEC_BY_NAME:
-        codec->impl = codec->createCodecByName(arg);
+        codec->impl = AMediaCodec_createCodecByName(arg);
         break;
     case CREATE_DECODER_BY_TYPE:
-        codec->impl = codec->createDecoderByType(arg);
+        codec->impl = AMediaCodec_createDecoderByType(arg);
         break;
     case CREATE_ENCODER_BY_TYPE:
-        codec->impl = codec->createEncoderByType(arg);
+        codec->impl = AMediaCodec_createEncoderByType(arg);
         break;
     default:
         av_assert0(0);
@@ -2201,7 +2107,7 @@ static int mediacodec_ndk_delete(FFAMediaCodec* ctx)
 
     av_assert0(codec->api.class == &amediacodec_ndk_class);
 
-    if (codec->impl && (codec->delete(codec->impl) != AMEDIA_OK))
+    if (codec->impl && (AMediaCodec_delete(codec->impl) != AMEDIA_OK))
         ret = AVERROR_EXTERNAL;
     if (codec->window)
         ANativeWindow_release(codec->window);
@@ -2246,7 +2152,7 @@ static int mediacodec_ndk_configure(FFAMediaCodec* ctx,
             return AVERROR_EXTERNAL;
         }
 
-        status = codec->configure(codec->impl, format->impl, NULL, NULL, flags);
+        status = AMediaCodec_configure(codec->impl, format->impl, NULL, NULL, flags);
         if (status != AMEDIA_OK) {
             av_log(codec, AV_LOG_ERROR, "Encoder configure failed, %d\n", status);
             return AVERROR_EXTERNAL;
@@ -2261,7 +2167,7 @@ static int mediacodec_ndk_configure(FFAMediaCodec* ctx,
             return AVERROR_EXTERNAL;
         }
     } else {
-        status = codec->configure(codec->impl, format->impl, native_window, NULL, flags);
+        status = AMediaCodec_configure(codec->impl, format->impl, native_window, NULL, flags);
         if (status != AMEDIA_OK) {
             av_log(codec, AV_LOG_ERROR, "Decoder configure failed, %d\n", status);
             return AVERROR_EXTERNAL;
@@ -2275,7 +2181,7 @@ static int mediacodec_ndk_configure(FFAMediaCodec* ctx,
 static int mediacodec_ndk_ ## method(FFAMediaCodec* ctx)                 \
 {                                                                        \
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;                   \
-    media_status_t status = codec->method(codec->impl);                  \
+    media_status_t status = AMediaCodec_ ## method (codec->impl);                  \
                                                                          \
     if (status != AMEDIA_OK) {                                           \
         av_log(codec, AV_LOG_ERROR, #method " failed, %d\n", status);    \
@@ -2292,19 +2198,19 @@ MEDIACODEC_NDK_WRAPPER(flush)
 static uint8_t* mediacodec_ndk_getInputBuffer(FFAMediaCodec* ctx, size_t idx, size_t *out_size)
 {
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
-    return codec->getInputBuffer(codec->impl, idx, out_size);
+    return AMediaCodec_getInputBuffer(codec->impl, idx, out_size);
 }
 
 static uint8_t* mediacodec_ndk_getOutputBuffer(FFAMediaCodec* ctx, size_t idx, size_t *out_size)
 {
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
-    return codec->getOutputBuffer(codec->impl, idx, out_size);
+    return AMediaCodec_getOutputBuffer(codec->impl, idx, out_size);
 }
 
 static ssize_t mediacodec_ndk_dequeueInputBuffer(FFAMediaCodec* ctx, int64_t timeoutUs)
 {
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
-    return codec->dequeueInputBuffer(codec->impl, timeoutUs);
+    return AMediaCodec_dequeueInputBuffer(codec->impl, timeoutUs);
 }
 
 static int mediacodec_ndk_queueInputBuffer(FFAMediaCodec *ctx, size_t idx,
@@ -2312,7 +2218,7 @@ static int mediacodec_ndk_queueInputBuffer(FFAMediaCodec *ctx, size_t idx,
                                            uint64_t time, uint32_t flags)
 {
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
-    return codec->queueInputBuffer(codec->impl, idx, offset, size, time, flags);
+    return AMediaCodec_queueInputBuffer(codec->impl, idx, offset, size, time, flags);
 }
 
 static ssize_t mediacodec_ndk_dequeueOutputBuffer(FFAMediaCodec* ctx, FFAMediaCodecBufferInfo *info, int64_t timeoutUs)
@@ -2321,7 +2227,7 @@ static ssize_t mediacodec_ndk_dequeueOutputBuffer(FFAMediaCodec* ctx, FFAMediaCo
     AMediaCodecBufferInfo buf_info = {0};
     ssize_t ret;
 
-    ret = codec->dequeueOutputBuffer(codec->impl, &buf_info, timeoutUs);
+    ret = AMediaCodec_dequeueOutputBuffer(codec->impl, &buf_info, timeoutUs);
     info->offset = buf_info.offset;
     info->size = buf_info.size;
     info->presentationTimeUs = buf_info.presentationTimeUs;
@@ -2333,7 +2239,7 @@ static ssize_t mediacodec_ndk_dequeueOutputBuffer(FFAMediaCodec* ctx, FFAMediaCo
 static FFAMediaFormat* mediacodec_ndk_getOutputFormat(FFAMediaCodec* ctx)
 {
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
-    AMediaFormat *format = codec->getOutputFormat(codec->impl);
+    AMediaFormat *format = AMediaCodec_getOutputFormat(codec->impl);
 
     if (!format)
         return NULL;
@@ -2345,7 +2251,7 @@ static int mediacodec_ndk_releaseOutputBuffer(FFAMediaCodec* ctx, size_t idx, in
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
     media_status_t status;
 
-    status = codec->releaseOutputBuffer(codec->impl, idx, render);
+    status = AMediaCodec_releaseOutputBuffer(codec->impl, idx, render);
     if (status != AMEDIA_OK) {
         av_log(codec, AV_LOG_ERROR, "release output buffer failed, %d\n", status);
         return AVERROR_EXTERNAL;
@@ -2359,7 +2265,7 @@ static int mediacodec_ndk_releaseOutputBufferAtTime(FFAMediaCodec *ctx, size_t i
     FFAMediaCodecNdk *codec = (FFAMediaCodecNdk *)ctx;
     media_status_t status;
 
-    status = codec->releaseOutputBufferAtTime(codec->impl, idx, timestampNs);
+    status = AMediaCodec_releaseOutputBufferAtTime(codec->impl, idx, timestampNs);
     if (status != AMEDIA_OK) {
         av_log(codec, AV_LOG_ERROR, "releaseOutputBufferAtTime failed, %d\n", status);
         return AVERROR_EXTERNAL;
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [FFmpeg-devel] [PATCH 3/8] avcodec/mediacodec_wrapper: Fix unused variable warning
       [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 2/8] avcodec/mediacodec_wrapper: link to NDK mediacodec API directly Zhao Zhili
@ 2024-04-17  4:37 ` Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 4/8] avcodec/mediacodecenc: Fix return empty packet when bsf is used Zhao Zhili
                   ` (4 subsequent siblings)
  6 siblings, 0 replies; 7+ messages in thread
From: Zhao Zhili @ 2024-04-17  4:37 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

From: Zhao Zhili <zhilizhao@tencent.com>

---
 libavcodec/mediacodec_wrapper.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/libavcodec/mediacodec_wrapper.c b/libavcodec/mediacodec_wrapper.c
index a9c8b522e0..96c886666a 100644
--- a/libavcodec/mediacodec_wrapper.c
+++ b/libavcodec/mediacodec_wrapper.c
@@ -365,6 +365,7 @@ int ff_AMediaCodecProfile_getProfileFromAVCodecContext(AVCodecContext *avctx)
     (void)VP9Profile3HDR;
     (void)VP9Profile2HDR10Plus;
     (void)VP9Profile3HDR10Plus;
+    (void)MPEG4ProfileSimpleFace;
     (void)AV1ProfileMain10;
     (void)AV1ProfileMain10HDR10;
     (void)AV1ProfileMain10HDR10Plus;
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [FFmpeg-devel] [PATCH 4/8] avcodec/mediacodecenc: Fix return empty packet when bsf is used
       [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 2/8] avcodec/mediacodec_wrapper: link to NDK mediacodec API directly Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 3/8] avcodec/mediacodec_wrapper: Fix unused variable warning Zhao Zhili
@ 2024-04-17  4:37 ` Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 5/8] avcodec/mediacodecenc: Remove write only variable Zhao Zhili
                   ` (3 subsequent siblings)
  6 siblings, 0 replies; 7+ messages in thread
From: Zhao Zhili @ 2024-04-17  4:37 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

From: Zhao Zhili <zhilizhao@tencent.com>

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
 libavcodec/mediacodecenc.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c
index b59de75b9b..e562181120 100644
--- a/libavcodec/mediacodecenc.c
+++ b/libavcodec/mediacodecenc.c
@@ -534,7 +534,7 @@ static int mediacodec_encode(AVCodecContext *avctx, AVPacket *pkt)
                 return 0;
         }
 
-        if (ret != AVERROR(EAGAIN))
+        if (ret < 0 && ret != AVERROR(EAGAIN))
             return ret;
 
         if (!s->frame->buf[0]) {
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [FFmpeg-devel] [PATCH 5/8] avcodec/mediacodecenc: Remove write only variable
       [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
                   ` (2 preceding siblings ...)
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 4/8] avcodec/mediacodecenc: Fix return empty packet when bsf is used Zhao Zhili
@ 2024-04-17  4:37 ` Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 6/8] avcodec/mediacodecenc: Add global header support Zhao Zhili
                   ` (2 subsequent siblings)
  6 siblings, 0 replies; 7+ messages in thread
From: Zhao Zhili @ 2024-04-17  4:37 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

From: Zhao Zhili <zhilizhao@tencent.com>

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
 libavcodec/mediacodecenc.c | 10 +++-------
 1 file changed, 3 insertions(+), 7 deletions(-)

diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c
index e562181120..8caaad729a 100644
--- a/libavcodec/mediacodecenc.c
+++ b/libavcodec/mediacodecenc.c
@@ -352,9 +352,7 @@ bailout:
     return ret;
 }
 
-static int mediacodec_receive(AVCodecContext *avctx,
-                               AVPacket *pkt,
-                               int *got_packet)
+static int mediacodec_receive(AVCodecContext *avctx, AVPacket *pkt)
 {
     MediaCodecEncContext *s = avctx->priv_data;
     FFAMediaCodec *codec = s->codec;
@@ -400,7 +398,7 @@ static int mediacodec_receive(AVCodecContext *avctx,
         memcpy(s->extradata, out_buf + out_info.offset, out_info.size);
         ff_AMediaCodec_releaseOutputBuffer(codec, index, false);
         // try immediately
-        return mediacodec_receive(avctx, pkt, got_packet);
+        return mediacodec_receive(avctx, pkt);
     }
 
     ret = ff_get_encode_buffer(avctx, pkt, out_info.size + s->extradata_size, 0);
@@ -419,7 +417,6 @@ static int mediacodec_receive(AVCodecContext *avctx,
     if (out_info.flags & ff_AMediaCodec_getBufferFlagKeyFrame(codec))
         pkt->flags |= AV_PKT_FLAG_KEY;
     ret = 0;
-    *got_packet = 1;
 
     av_log(avctx, AV_LOG_TRACE, "receive packet pts %" PRId64 " dts %" PRId64
            " flags %d extradata %d\n",
@@ -510,7 +507,6 @@ static int mediacodec_encode(AVCodecContext *avctx, AVPacket *pkt)
 {
     MediaCodecEncContext *s = avctx->priv_data;
     int ret;
-    int got_packet = 0;
 
     // Return on three case:
     // 1. Serious error
@@ -525,7 +521,7 @@ static int mediacodec_encode(AVCodecContext *avctx, AVPacket *pkt)
                 return ret;
         }
 
-        ret = mediacodec_receive(avctx, pkt, &got_packet);
+        ret = mediacodec_receive(avctx, pkt);
         if (s->bsf) {
             if (!ret || ret == AVERROR_EOF)
                 ret = av_bsf_send_packet(s->bsf, pkt);
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [FFmpeg-devel] [PATCH 6/8] avcodec/mediacodecenc: Add global header support
       [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
                   ` (3 preceding siblings ...)
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 5/8] avcodec/mediacodecenc: Remove write only variable Zhao Zhili
@ 2024-04-17  4:37 ` Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 7/8] avcodec/mediacodecenc: add AV_CODEC_CAP_ENCODER_FLUSH support Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 8/8] fftools: Fix implicit-const-int-float-conversion warning Zhao Zhili
  6 siblings, 0 replies; 7+ messages in thread
From: Zhao Zhili @ 2024-04-17  4:37 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

From: Zhao Zhili <zhilizhao@tencent.com>

The extradata is generated by encoding a dummy frame, then reset
the encoder state by mediacodec flush(). It only works for pixel
format other than AV_PIX_FMT_MEDIACODEC, since I'm not sure how
to create a dummy frame safely with AV_PIX_FMT_MEDIACODEC.

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
 configure                  |   6 +-
 libavcodec/mediacodecenc.c | 166 +++++++++++++++++++++++++++++++++----
 2 files changed, 155 insertions(+), 17 deletions(-)

diff --git a/configure b/configure
index d0d0e8430b..4da1c0be35 100755
--- a/configure
+++ b/configure
@@ -3313,6 +3313,7 @@ ac3_mf_encoder_deps="mediafoundation"
 av1_cuvid_decoder_deps="cuvid CUVIDAV1PICPARAMS"
 av1_mediacodec_decoder_deps="mediacodec"
 av1_mediacodec_encoder_deps="mediacodec"
+av1_mediacodec_encoder_select="extract_extradata_bsf"
 av1_nvenc_encoder_deps="nvenc NV_ENC_PIC_PARAMS_AV1"
 av1_nvenc_encoder_select="atsc_a53"
 h263_v4l2m2m_decoder_deps="v4l2_m2m h263_v4l2_m2m"
@@ -3323,7 +3324,7 @@ h264_cuvid_decoder_select="h264_mp4toannexb_bsf"
 h264_mediacodec_decoder_deps="mediacodec"
 h264_mediacodec_decoder_select="h264_mp4toannexb_bsf h264_parser"
 h264_mediacodec_encoder_deps="mediacodec"
-h264_mediacodec_encoder_select="h264_metadata"
+h264_mediacodec_encoder_select="extract_extradata_bsf h264_metadata"
 h264_mf_encoder_deps="mediafoundation"
 h264_mmal_decoder_deps="mmal"
 h264_nvenc_encoder_deps="nvenc"
@@ -3343,7 +3344,7 @@ hevc_cuvid_decoder_select="hevc_mp4toannexb_bsf"
 hevc_mediacodec_decoder_deps="mediacodec"
 hevc_mediacodec_decoder_select="hevc_mp4toannexb_bsf hevc_parser"
 hevc_mediacodec_encoder_deps="mediacodec"
-hevc_mediacodec_encoder_select="hevc_metadata"
+hevc_mediacodec_encoder_select="extract_extradata_bsf hevc_metadata"
 hevc_mf_encoder_deps="mediafoundation"
 hevc_nvenc_encoder_deps="nvenc"
 hevc_nvenc_encoder_select="atsc_a53"
@@ -3375,6 +3376,7 @@ mpeg2_v4l2m2m_decoder_deps="v4l2_m2m mpeg2_v4l2_m2m"
 mpeg4_cuvid_decoder_deps="cuvid"
 mpeg4_mediacodec_decoder_deps="mediacodec"
 mpeg4_mediacodec_encoder_deps="mediacodec"
+mpeg4_mediacodec_encoder_select="extract_extradata_bsf"
 mpeg4_mmal_decoder_deps="mmal"
 mpeg4_omx_encoder_deps="omx"
 mpeg4_v4l2m2m_decoder_deps="v4l2_m2m mpeg4_v4l2_m2m"
diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c
index 8caaad729a..64816ccf0a 100644
--- a/libavcodec/mediacodecenc.c
+++ b/libavcodec/mediacodecenc.c
@@ -23,6 +23,7 @@
 #include "config_components.h"
 
 #include "libavutil/avassert.h"
+#include "libavutil/avstring.h"
 #include "libavutil/hwcontext_mediacodec.h"
 #include "libavutil/imgutils.h"
 #include "libavutil/mem.h"
@@ -74,6 +75,7 @@ typedef struct MediaCodecEncContext {
     int bitrate_mode;
     int level;
     int pts_as_dts;
+    int extract_extradata;
 } MediaCodecEncContext;
 
 enum {
@@ -112,6 +114,23 @@ static void mediacodec_output_format(AVCodecContext *avctx)
     ff_AMediaFormat_delete(out_format);
 }
 
+static int extract_extradata_support(AVCodecContext *avctx)
+{
+    const AVBitStreamFilter *bsf = av_bsf_get_by_name("extract_extradata");
+
+    if (!bsf) {
+        av_log(avctx, AV_LOG_WARNING, "extract_extradata bsf not found\n");
+        return 0;
+    }
+
+    for (int i = 0; bsf->codec_ids[i] != AV_CODEC_ID_NONE; i++) {
+        if (bsf->codec_ids[i] == avctx->codec_id)
+            return 1;
+    }
+
+    return 0;
+}
+
 static int mediacodec_init_bsf(AVCodecContext *avctx)
 {
     MediaCodecEncContext *s = avctx->priv_data;
@@ -120,20 +139,32 @@ static int mediacodec_init_bsf(AVCodecContext *avctx)
     int crop_right = s->width - avctx->width;
     int crop_bottom = s->height - avctx->height;
 
-    if (!crop_right && !crop_bottom)
+    /* Nothing can be done for this format now */
+    if (avctx->pix_fmt == AV_PIX_FMT_MEDIACODEC)
         return 0;
 
-    if (avctx->codec_id == AV_CODEC_ID_H264)
-        ret = snprintf(str, sizeof(str), "h264_metadata=crop_right=%d:crop_bottom=%d",
-                 crop_right, crop_bottom);
-    else if (avctx->codec_id == AV_CODEC_ID_HEVC)
-        ret = snprintf(str, sizeof(str), "hevc_metadata=crop_right=%d:crop_bottom=%d",
-                 crop_right, crop_bottom);
-    else
+    s->extract_extradata = (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER) &&
+                           extract_extradata_support(avctx);
+    if (!crop_right && !crop_bottom && !s->extract_extradata)
         return 0;
 
-    if (ret >= sizeof(str))
-        return AVERROR_BUFFER_TOO_SMALL;
+    ret = 0;
+    if (crop_right || crop_bottom) {
+        if (avctx->codec_id == AV_CODEC_ID_H264)
+            ret = snprintf(str, sizeof(str), "h264_metadata=crop_right=%d:crop_bottom=%d",
+                           crop_right, crop_bottom);
+        else if (avctx->codec_id == AV_CODEC_ID_HEVC)
+            ret = snprintf(str, sizeof(str), "hevc_metadata=crop_right=%d:crop_bottom=%d",
+                           crop_right, crop_bottom);
+        if (ret >= sizeof(str))
+            return AVERROR_BUFFER_TOO_SMALL;
+    }
+
+    if (s->extract_extradata) {
+        ret = av_strlcatf(str, sizeof(str), "%sextract_extradata", ret ? "," : "");
+        if (ret >= sizeof(str))
+            return AVERROR_BUFFER_TOO_SMALL;
+    }
 
     ret = av_bsf_list_parse_str(str, &s->bsf);
     if (ret < 0)
@@ -148,6 +179,8 @@ static int mediacodec_init_bsf(AVCodecContext *avctx)
     return ret;
 }
 
+static int mediacodec_generate_extradata(AVCodecContext *avctx);
+
 static av_cold int mediacodec_init(AVCodecContext *avctx)
 {
     const char *codec_mime = NULL;
@@ -337,14 +370,14 @@ static av_cold int mediacodec_init(AVCodecContext *avctx)
         goto bailout;
 
     mediacodec_output_format(avctx);
-    if (avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER)
-        av_log(avctx, AV_LOG_WARNING,
-                "Mediacodec encoder doesn't support AV_CODEC_FLAG_GLOBAL_HEADER. "
-                "Use extract_extradata bsf when necessary.\n");
 
     s->frame = av_frame_alloc();
-    if (!s->frame)
+    if (!s->frame) {
         ret = AVERROR(ENOMEM);
+        goto bailout;
+    }
+
+    ret = mediacodec_generate_extradata(avctx);
 
 bailout:
     if (format)
@@ -549,6 +582,109 @@ static int mediacodec_encode(AVCodecContext *avctx, AVPacket *pkt)
     return 0;
 }
 
+static int mediacodec_send_dummy_frame(AVCodecContext *avctx)
+{
+    MediaCodecEncContext *s = avctx->priv_data;
+    int ret;
+
+    s->frame->width = avctx->width;
+    s->frame->height = avctx->height;
+    s->frame->format = avctx->pix_fmt;
+    s->frame->pts = 0;
+
+    ret = av_frame_get_buffer(s->frame, 0);
+    if (ret < 0)
+        return ret;
+
+    do {
+        ret = mediacodec_send(avctx, s->frame);
+    } while (ret == AVERROR(EAGAIN));
+    av_frame_unref(s->frame);
+
+    if (ret < 0)
+        return ret;
+
+    ret = mediacodec_send(avctx, NULL);
+    if (ret < 0) {
+        av_log(avctx, AV_LOG_ERROR, "Flush failed: %s\n", av_err2str(ret));
+        return ret;
+    }
+
+    return 0;
+}
+
+static int mediacodec_receive_dummy_pkt(AVCodecContext *avctx, AVPacket *pkt)
+{
+    MediaCodecEncContext *s = avctx->priv_data;
+    int ret;
+
+    do {
+        ret = mediacodec_receive(avctx, pkt);
+    } while (ret == AVERROR(EAGAIN));
+
+    if (ret < 0)
+        return ret;
+
+    do {
+        ret = av_bsf_send_packet(s->bsf, pkt);
+        if (ret < 0)
+            return ret;
+        ret = av_bsf_receive_packet(s->bsf, pkt);
+    } while (ret == AVERROR(EAGAIN));
+
+    return ret;
+}
+
+static int mediacodec_generate_extradata(AVCodecContext *avctx)
+{
+    MediaCodecEncContext *s = avctx->priv_data;
+    AVPacket *pkt = NULL;
+    int ret;
+    size_t side_size;
+    uint8_t *side;
+
+    if (!(avctx->flags & AV_CODEC_FLAG_GLOBAL_HEADER))
+        return 0;
+
+    if (!s->extract_extradata) {
+        av_log(avctx, AV_LOG_WARNING,
+               "Mediacodec encoder doesn't support AV_CODEC_FLAG_GLOBAL_HEADER. "
+               "Use extract_extradata bsf when necessary.\n");
+        return 0;
+    }
+
+    pkt = av_packet_alloc();
+    if (!pkt)
+        return AVERROR(ENOMEM);
+
+    ret = mediacodec_send_dummy_frame(avctx);
+    if (ret < 0)
+        goto bailout;
+    ret = mediacodec_receive_dummy_pkt(avctx, pkt);
+    if (ret < 0)
+        goto bailout;
+
+    side = av_packet_get_side_data(pkt, AV_PKT_DATA_NEW_EXTRADATA, &side_size);
+    if (side && side_size > 0) {
+        avctx->extradata = av_mallocz(side_size + AV_INPUT_BUFFER_PADDING_SIZE);
+        if (!avctx->extradata) {
+            ret = AVERROR(ENOMEM);
+            goto bailout;
+        }
+
+        memcpy(avctx->extradata, side, side_size);
+        avctx->extradata_size = side_size;
+    }
+
+bailout:
+    if (s->eof_sent) {
+        s->eof_sent = 0;
+        ff_AMediaCodec_flush(s->codec);
+    }
+    av_packet_free(&pkt);
+    return ret;
+}
+
 static av_cold int mediacodec_close(AVCodecContext *avctx)
 {
     MediaCodecEncContext *s = avctx->priv_data;
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [FFmpeg-devel] [PATCH 7/8] avcodec/mediacodecenc: add AV_CODEC_CAP_ENCODER_FLUSH support
       [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
                   ` (4 preceding siblings ...)
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 6/8] avcodec/mediacodecenc: Add global header support Zhao Zhili
@ 2024-04-17  4:37 ` Zhao Zhili
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 8/8] fftools: Fix implicit-const-int-float-conversion warning Zhao Zhili
  6 siblings, 0 replies; 7+ messages in thread
From: Zhao Zhili @ 2024-04-17  4:37 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

From: Zhao Zhili <zhilizhao@tencent.com>

Signed-off-by: Zhao Zhili <zhilizhao@tencent.com>
---
 libavcodec/mediacodecenc.c | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/libavcodec/mediacodecenc.c b/libavcodec/mediacodecenc.c
index 64816ccf0a..c87a0d86c5 100644
--- a/libavcodec/mediacodecenc.c
+++ b/libavcodec/mediacodecenc.c
@@ -705,6 +705,15 @@ static av_cold int mediacodec_close(AVCodecContext *avctx)
     return 0;
 }
 
+static av_cold void mediacodec_flush(AVCodecContext *avctx)
+{
+    MediaCodecEncContext *s = avctx->priv_data;
+    if (s->bsf)
+        av_bsf_flush(s->bsf);
+    av_frame_unref(s->frame);
+    ff_AMediaCodec_flush(s->codec);
+}
+
 static const AVCodecHWConfigInternal *const mediacodec_hw_configs[] = {
     &(const AVCodecHWConfigInternal) {
         .public          = {
@@ -755,13 +764,15 @@ const FFCodec ff_ ## short_name ## _mediacodec_encoder = {              \
     CODEC_LONG_NAME(long_name " Android MediaCodec encoder"),           \
     .p.type           = AVMEDIA_TYPE_VIDEO,                             \
     .p.id             = codec_id,                                       \
-    .p.capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY           \
-                        | AV_CODEC_CAP_HARDWARE,                        \
+    .p.capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY |         \
+                        AV_CODEC_CAP_HARDWARE |                         \
+                        AV_CODEC_CAP_ENCODER_FLUSH,                     \
     .priv_data_size   = sizeof(MediaCodecEncContext),                   \
     .p.pix_fmts       = avc_pix_fmts,                                   \
     .init             = mediacodec_init,                                \
     FF_CODEC_RECEIVE_PACKET_CB(mediacodec_encode),                      \
     .close            = mediacodec_close,                               \
+    .flush            = mediacodec_flush,                               \
     .p.priv_class     = &short_name ## _mediacodec_class,               \
     .caps_internal    = FF_CODEC_CAP_INIT_CLEANUP,                      \
     .p.wrapper_name = "mediacodec",                                     \
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [FFmpeg-devel] [PATCH 8/8] fftools: Fix implicit-const-int-float-conversion warning
       [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
                   ` (5 preceding siblings ...)
  2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 7/8] avcodec/mediacodecenc: add AV_CODEC_CAP_ENCODER_FLUSH support Zhao Zhili
@ 2024-04-17  4:37 ` Zhao Zhili
  6 siblings, 0 replies; 7+ messages in thread
From: Zhao Zhili @ 2024-04-17  4:37 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Zhao Zhili

From: Zhao Zhili <zhilizhao@tencent.com>

---
 fftools/cmdutils.c   | 2 +-
 fftools/ffmpeg_opt.c | 2 +-
 2 files changed, 2 insertions(+), 2 deletions(-)

diff --git a/fftools/cmdutils.c b/fftools/cmdutils.c
index 2120fc7935..a8f5c6d89b 100644
--- a/fftools/cmdutils.c
+++ b/fftools/cmdutils.c
@@ -311,7 +311,7 @@ static int write_option(void *optctx, const OptionDef *po, const char *opt,
 
         *(int *)dst = num;
     } else if (po->type == OPT_TYPE_INT64) {
-        ret = parse_number(opt, arg, OPT_TYPE_INT64, INT64_MIN, INT64_MAX, &num);
+        ret = parse_number(opt, arg, OPT_TYPE_INT64, INT64_MIN, (double)INT64_MAX, &num);
         if (ret < 0)
             goto finish;
 
diff --git a/fftools/ffmpeg_opt.c b/fftools/ffmpeg_opt.c
index 6526e8e3e8..910e4a336b 100644
--- a/fftools/ffmpeg_opt.c
+++ b/fftools/ffmpeg_opt.c
@@ -317,7 +317,7 @@ static int opt_filter_threads(void *optctx, const char *opt, const char *arg)
 static int opt_abort_on(void *optctx, const char *opt, const char *arg)
 {
     static const AVOption opts[] = {
-        { "abort_on"           , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, INT64_MAX,           .unit = "flags" },
+        { "abort_on"           , NULL, 0, AV_OPT_TYPE_FLAGS, { .i64 = 0 }, INT64_MIN, (double)INT64_MAX,   .unit = "flags" },
         { "empty_output"       , NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT        }, .unit = "flags" },
         { "empty_output_stream", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = ABORT_ON_FLAG_EMPTY_OUTPUT_STREAM }, .unit = "flags" },
         { NULL },
-- 
2.25.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2024-04-17  4:39 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <20240417043742.505853-1-quinkblack@foxmail.com>
2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 2/8] avcodec/mediacodec_wrapper: link to NDK mediacodec API directly Zhao Zhili
2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 3/8] avcodec/mediacodec_wrapper: Fix unused variable warning Zhao Zhili
2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 4/8] avcodec/mediacodecenc: Fix return empty packet when bsf is used Zhao Zhili
2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 5/8] avcodec/mediacodecenc: Remove write only variable Zhao Zhili
2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 6/8] avcodec/mediacodecenc: Add global header support Zhao Zhili
2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 7/8] avcodec/mediacodecenc: add AV_CODEC_CAP_ENCODER_FLUSH support Zhao Zhili
2024-04-17  4:37 ` [FFmpeg-devel] [PATCH 8/8] fftools: Fix implicit-const-int-float-conversion warning Zhao Zhili

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git