* [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