Source code

Revision control

Copy as Markdown

Other Tools

diff --git a/media/ffvpx/libavcodec/avcodec.h b/media/ffvpx/libavcodec/avcodec.h
--- a/media/ffvpx/libavcodec/avcodec.h
+++ b/media/ffvpx/libavcodec/avcodec.h
@@ -2106,6 +2106,8 @@ typedef struct AVCodecContext {
AVFrameSideData **decoded_side_data;
int nb_decoded_side_data;
+ int moz_extradata_offset;
+
void* moz_ndk_crypto;
} AVCodecContext;
diff --git a/media/ffvpx/libavcodec/mediacodecdec.c b/media/ffvpx/libavcodec/mediacodecdec.c
--- a/media/ffvpx/libavcodec/mediacodecdec.c
+++ b/media/ffvpx/libavcodec/mediacodecdec.c
@@ -36,9 +36,13 @@
#include "avcodec.h"
#include "codec_internal.h"
#include "decode.h"
+#if CONFIG_H264_MEDIACODEC_DECODER_EXTRADATA
#include "h264_parse.h"
#include "h264_ps.h"
+#endif
+#if CONFIG_HEVC_MEDIACODEC_DECODER_EXTRADATA
#include "hevc/parse.h"
+#endif
#include "hwconfig.h"
#include "internal.h"
#include "fffjni.h"
@@ -127,9 +131,9 @@ done:
}
#endif
-#if CONFIG_H264_MEDIACODEC_DECODER
static int h264_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
{
+#if CONFIG_H264_MEDIACODEC_DECODER_EXTRADATA
int i;
int ret;
@@ -190,10 +194,25 @@ done:
ff_h264_ps_uninit(&ps);
return ret;
-}
+#else
+ const uint8_t* ed = avctx->extradata;
+ int edsize = avctx->extradata_size;
+ int edoffset = avctx->moz_extradata_offset;
+
+ if (ed) {
+ if (edoffset > 0 && edoffset < edsize) {
+ ff_AMediaFormat_setBuffer(format, "csd-0", ed, edoffset);
+ ff_AMediaFormat_setBuffer(format, "csd-1", ed + edoffset, edsize - edoffset);
+ } else {
+ ff_AMediaFormat_setBuffer(format, "csd-0", ed, edsize);
+ }
+ }
+
+ return 0;
#endif
+}
-#if CONFIG_HEVC_MEDIACODEC_DECODER
+#if CONFIG_HEVC_MEDIACODEC_DECODER_EXTRADATA
static int hevc_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
{
int i;
@@ -297,7 +316,8 @@ done:
CONFIG_AAC_MEDIACODEC_DECODER || \
CONFIG_AMRNB_MEDIACODEC_DECODER || \
CONFIG_AMRWB_MEDIACODEC_DECODER || \
- CONFIG_MP3_MEDIACODEC_DECODER
+ CONFIG_MP3_MEDIACODEC_DECODER || \
+ !CONFIG_HEVC_MEDIACODEC_DECODER_EXTRADATA
static int common_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
{
int ret = 0;
@@ -353,7 +373,11 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
case AV_CODEC_ID_HEVC:
codec_mime = "video/hevc";
+#if CONFIG_HEVC_MEDIACODEC_DECODER_EXTRADATA
ret = hevc_set_extradata(avctx, format);
+#else
+ ret = common_set_extradata(avctx, format);
+#endif
if (ret < 0)
goto done;
break;
@@ -637,11 +661,11 @@ const FFCodec ff_ ## short_name ## _mediacodec_decoder = {
}; \
#if CONFIG_H264_MEDIACODEC_DECODER
-DECLARE_MEDIACODEC_VDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb")
+DECLARE_MEDIACODEC_VDEC(h264, "H.264", AV_CODEC_ID_H264, NULL)
#endif
#if CONFIG_HEVC_MEDIACODEC_DECODER
-DECLARE_MEDIACODEC_VDEC(hevc, "H.265", AV_CODEC_ID_HEVC, "hevc_mp4toannexb")
+DECLARE_MEDIACODEC_VDEC(hevc, "H.265", AV_CODEC_ID_HEVC, NULL)
#endif
#if CONFIG_MPEG2_MEDIACODEC_DECODER
diff --git a/media/ffvpx/mediacodec_h264.patch b/media/ffvpx/mediacodec_h264.patch
new file mode 100644
--- /dev/null
+++ b/media/ffvpx/mediacodec_h264.patch
@@ -0,0 +1,73 @@
+diff --git a/media/ffvpx/libavcodec/mediacodecdec.c b/media/ffvpx/libavcodec/mediacodecdec.c
+--- a/media/ffvpx/libavcodec/mediacodecdec.c
++++ b/media/ffvpx/libavcodec/mediacodecdec.c
+@@ -36,9 +36,13 @@
+ #include "avcodec.h"
+ #include "codec_internal.h"
+ #include "decode.h"
++#if CONFIG_H264_MEDIACODEC_DECODER_EXTRADATA
+ #include "h264_parse.h"
+ #include "h264_ps.h"
++#endif
++#if CONFIG_HEVC_MEDIACODEC_DECODER_EXTRADATA
+ #include "hevc/parse.h"
++#endif
+ #include "hwconfig.h"
+ #include "internal.h"
+ #include "fffjni.h"
+@@ -127,7 +131,7 @@ done:
+ }
+ #endif
+
+-#if CONFIG_H264_MEDIACODEC_DECODER
++#if CONFIG_H264_MEDIACODEC_DECODER_EXTRADATA
+ static int h264_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
+ {
+ int i;
+@@ -193,7 +197,7 @@ done:
+ }
+ #endif
+
+-#if CONFIG_HEVC_MEDIACODEC_DECODER
++#if CONFIG_HEVC_MEDIACODEC_DECODER_EXTRADATA
+ static int hevc_set_extradata(AVCodecContext *avctx, FFAMediaFormat *format)
+ {
+ int i;
+@@ -344,7 +348,11 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
+ case AV_CODEC_ID_H264:
+ codec_mime = "video/avc";
+
++#if CONFIG_H264_MEDIACODEC_DECODER_EXTRADATA
+ ret = h264_set_extradata(avctx, format);
++#else
++ ret = 0;
++#endif
+ if (ret < 0)
+ goto done;
+ break;
+@@ -353,7 +361,11 @@ static av_cold int mediacodec_decode_init(AVCodecContext *avctx)
+ case AV_CODEC_ID_HEVC:
+ codec_mime = "video/hevc";
+
++#if CONFIG_HEVC_MEDIACODEC_DECODER_EXTRADATA
+ ret = hevc_set_extradata(avctx, format);
++#else
++ ret = 0;
++#endif
+ if (ret < 0)
+ goto done;
+ break;
+@@ -637,11 +649,11 @@ const FFCodec ff_ ## short_name ## _mediacodec_decoder = {
+ }; \
+
+ #if CONFIG_H264_MEDIACODEC_DECODER
+-DECLARE_MEDIACODEC_VDEC(h264, "H.264", AV_CODEC_ID_H264, "h264_mp4toannexb")
++DECLARE_MEDIACODEC_VDEC(h264, "H.264", AV_CODEC_ID_H264, NULL)
+ #endif
+
+ #if CONFIG_HEVC_MEDIACODEC_DECODER
+-DECLARE_MEDIACODEC_VDEC(hevc, "H.265", AV_CODEC_ID_HEVC, "hevc_mp4toannexb")
++DECLARE_MEDIACODEC_VDEC(hevc, "H.265", AV_CODEC_ID_HEVC, NULL)
+ #endif
+
+ #if CONFIG_MPEG2_MEDIACODEC_DECODER