Created
February 15, 2021 22:44
-
-
Save phhusson/d2dcfe685af303ac2d85e8ecbc87f2cd to your computer and use it in GitHub Desktop.
NOVA/AVOS Dolby Vision support
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
project native/avos/ | |
diff --git a/native/avos/Include/av.h b/native/avos/Include/av.h | |
index 9a78d87..4ff3df5 100644 | |
--- a/native/avos/Include/av.h | |
+++ b/native/avos/Include/av.h | |
@@ -462,6 +462,8 @@ typedef enum { | |
#define VIDEO_FOURCC_LAVC mmioFOURCC('L', 'A', 'V', 'C') | |
+#define VIDEO_FOURCC_DOLBY_VISION mmioFOURCC('D', 'V', 'V', 'C') | |
+ | |
#define VIDEO_MAX_WIDTH 7680 | |
#define VIDEO_MAX_HEIGHT 4320 | |
@@ -499,6 +501,7 @@ enum { | |
VIDEO_FORMAT_HEVC, | |
VIDEO_FORMAT_LAVC, | |
VIDEO_FORMAT_AV1, | |
+ VIDEO_FORMAT_DOLBY_VISION, | |
}; | |
// video sub formats | |
diff --git a/native/avos/Source/android_codecs.c b/native/avos/Source/android_codecs.c | |
index d595243..ee9e6ca 100644 | |
--- a/native/avos/Source/android_codecs.c | |
+++ b/native/avos/Source/android_codecs.c | |
@@ -125,6 +125,9 @@ int acodecs_is_supported(int format, int is_video, int is_sw_allowed) | |
case VIDEO_FORMAT_HEVC: | |
types[0] = "video/hevc"; | |
break; | |
+ case VIDEO_FORMAT_DOLBY_VISION: | |
+ types[0] = "video/dolby-vision"; | |
+ break; | |
} | |
} else { | |
switch (format) { | |
diff --git a/native/avos/Source/av.c b/native/avos/Source/av.c | |
index d179196..6359bb8 100644 | |
--- a/native/avos/Source/av.c | |
+++ b/native/avos/Source/av.c | |
@@ -161,6 +161,8 @@ static const VIDEO_FORMAT video_formats[] = | |
VIDEO_FOURCC_H265, VIDEO_FORMAT_HEVC, VIDEO_SUBFMT_NONE, "HEVC/H.265", | |
VIDEO_FOURCC_X265, VIDEO_FORMAT_HEVC, VIDEO_SUBFMT_NONE, "HEVC/H.265", | |
VIDEO_FOURCC_HEVC, VIDEO_FORMAT_HEVC, VIDEO_SUBFMT_NONE, "HEVC/H.265", | |
+ | |
+ VIDEO_FOURCC_DOLBY_VISION, VIDEO_FORMAT_DOLBY_VISION, VIDEO_SUBFMT_NONE, "Dolby Vision", | |
VIDEO_FOURCC_WMV1, VIDEO_FORMAT_WMV1, VIDEO_SUBFMT_NONE, "WMV7", | |
VIDEO_FOURCC_WMV2, VIDEO_FORMAT_WMV2, VIDEO_SUBFMT_NONE, "WMV8", | |
diff --git a/native/avos/Source/codec_sfdec.c b/native/avos/Source/codec_sfdec.c | |
index 3c84ed4..3606a37 100644 | |
--- a/native/avos/Source/codec_sfdec.c | |
+++ b/native/avos/Source/codec_sfdec.c | |
@@ -606,6 +606,9 @@ static int videodec_open(STREAM_DEC_VIDEO *dec, VIDEO_PROPERTIES *video, void *c | |
case VIDEO_FORMAT_H263: | |
sfdec_codec = SFDEC_VIDEO_H263; | |
break; | |
+ case VIDEO_FORMAT_DOLBY_VISION: | |
+ sfdec_codec = SFDEC_VIDEO_DOLBY_VISION; | |
+ break; | |
#if 0 | |
case VIDEO_FORMAT_MPEG: | |
sfdec_codec = SFDEC_VIDEO_MPEG2; | |
diff --git a/native/avos/Source/codec_sfdec2.c b/native/avos/Source/codec_sfdec2.c | |
index e1283f7..a8c0982 100644 | |
--- a/native/avos/Source/codec_sfdec2.c | |
+++ b/native/avos/Source/codec_sfdec2.c | |
@@ -596,6 +596,9 @@ static int videodec_open(STREAM_DEC_VIDEO *dec, VIDEO_PROPERTIES *video, void *c | |
} | |
switch (video->format) { | |
+ case VIDEO_FORMAT_DOLBY_VISION: | |
+ sfdec_codec = SFDEC_VIDEO_DOLBY_VISION; | |
+ break; | |
case VIDEO_FORMAT_H264: | |
sfdec_codec = SFDEC_VIDEO_AVC; | |
break; | |
@@ -945,6 +948,7 @@ OMXC_REGISTER( VIDEO_FORMAT_H264, &stream_video_mangler_H264 ); | |
#endif | |
#ifdef CONFIG_OMX_HEVC | |
OMXC_REGISTER( VIDEO_FORMAT_HEVC, NULL ); | |
+OMXC_REGISTER( VIDEO_FORMAT_DOLBY_VISION, NULL ); | |
#endif | |
#ifdef CONFIG_OMX_WMV | |
OMXC_REGISTER( VIDEO_FORMAT_WMV3, NULL ); | |
diff --git a/native/avos/Source/stream_parser.c b/native/avos/Source/stream_parser.c | |
index 3f623cb..bf44c12 100644 | |
--- a/native/avos/Source/stream_parser.c | |
+++ b/native/avos/Source/stream_parser.c | |
@@ -902,7 +902,7 @@ void stream_parser_send_video_extra( VIDEO_PROPERTIES *video, CBE *cbe, int *siz | |
} | |
#endif | |
#ifdef CONFIG_HEVC | |
- if( video->format == VIDEO_FORMAT_HEVC || video->format == VIDEO_FORMAT_WMV3 ) { | |
+ if( video->format == VIDEO_FORMAT_HEVC || video->format == VIDEO_FORMAT_WMV3 || video->format == VIDEO_FORMAT_DOLBY_VISION ) { | |
// do not send extradata inline | |
return; | |
} | |
diff --git a/native/avos/Source/stream_parser_ffmpeg.c b/native/avos/Source/stream_parser_ffmpeg.c | |
index 8379be3..2d49ae0 100644 | |
--- a/native/avos/Source/stream_parser_ffmpeg.c | |
+++ b/native/avos/Source/stream_parser_ffmpeg.c | |
@@ -412,6 +412,17 @@ serprintf("FF: parse H264 SPS\n"); | |
priv->av.vs_max ++; | |
discard = 0; | |
+ | |
+ serprintf("HELLO, Found %d side data!\r\n", st->nb_side_data); | |
+ int sideDataI; | |
+ for (sideDataI = 0; sideDataI < st->nb_side_data; sideDataI++) { | |
+ AVPacketSideData sd = st->side_data[i]; | |
+ if(sd.type == AV_PKT_DATA_DOVI_CONF) { | |
+ video->fourcc = VIDEO_FOURCC_DOLBY_VISION; | |
+ video->format = VIDEO_FORMAT_DOLBY_VISION; | |
+ serprintf("HELLO, This is a dolby vision content!\r\n"); | |
+ } | |
+ } | |
} | |
} else if( st->codec->codec_type == AVMEDIA_TYPE_AUDIO ){ | |
// | |
diff --git a/native/avos/Source/stream_video.c b/native/avos/Source/stream_video.c | |
index 84013c2..736d59b 100644 | |
--- a/native/avos/Source/stream_video.c | |
+++ b/native/avos/Source/stream_video.c | |
@@ -1796,7 +1796,7 @@ DBGS serprintf("H264 with NO SPS in extradata!\n"); | |
} | |
#endif | |
#ifdef CONFIG_HEVC | |
- if( s->video->fourcc == VIDEO_FOURCC_HEVC && s->video->extraDataSize ) { | |
+ if( (s->video->fourcc == VIDEO_FOURCC_HEVC || s->video->fourcc == VIDEO_FOURCC_DOLBY_VISION) && s->video->extraDataSize ) { | |
// convert extradata from HVCC to annexB if needed | |
if( !HEVC_convert_extradata( s->video ) ) { | |
DBGS serprintf("HVCC!\r\n" ); | |
diff --git a/native/avos/external/android/libsfdec/sfdec.h b/native/avos/external/android/libsfdec/sfdec.h | |
index ba95c9d..43a2d89 100644 | |
--- a/native/avos/external/android/libsfdec/sfdec.h | |
+++ b/native/avos/external/android/libsfdec/sfdec.h | |
@@ -41,6 +41,7 @@ typedef enum sfdec_codec_type { | |
SFDEC_VIDEO_AVC, | |
SFDEC_VIDEO_AV1, | |
SFDEC_VIDEO_HEVC, | |
+ SFDEC_VIDEO_DOLBY_VISION, | |
SFDEC_VIDEO_MPEG4, | |
SFDEC_VIDEO_H263, | |
SFDEC_VIDEO_MPEG2, | |
diff --git a/native/avos/external/android/libsfdec/sfdec_common.cpp b/native/avos/external/android/libsfdec/sfdec_common.cpp | |
index 3c15a02..dc08655 100644 | |
--- a/native/avos/external/android/libsfdec/sfdec_common.cpp | |
+++ b/native/avos/external/android/libsfdec/sfdec_common.cpp | |
@@ -27,6 +27,8 @@ const char *get_mimetype(sfdec_codec_t codec) | |
return "video/av01"; | |
case SFDEC_VIDEO_HEVC: | |
return "video/hevc"; | |
+ case SFDEC_VIDEO_DOLBY_VISION: | |
+ return "video/dolby-vision"; | |
case SFDEC_VIDEO_MPEG4: | |
return "video/mp4v-es"; | |
case SFDEC_VIDEO_H263: | |
diff --git a/native/avos/external/android/libsfdec/sfdec_mediacodec.cpp b/native/avos/external/android/libsfdec/sfdec_mediacodec.cpp | |
index 8d8d386..e177c65 100644 | |
--- a/native/avos/external/android/libsfdec/sfdec_mediacodec.cpp | |
+++ b/native/avos/external/android/libsfdec/sfdec_mediacodec.cpp | |
@@ -304,7 +304,7 @@ static sfdec_priv_t *sfdec_init(sfdec_codec_t codec, | |
if (extradata) { | |
if (codec == SFDEC_VIDEO_AVC) | |
nb_csd = set_avc_config(extradata, extradata_size, format); | |
- else if (codec == SFDEC_VIDEO_MPEG4 || codec == SFDEC_VIDEO_HEVC) | |
+ else if (codec == SFDEC_VIDEO_MPEG4 || codec == SFDEC_VIDEO_HEVC || codec == SFDEC_VIDEO_DOLBY_VISION) | |
nb_csd = set_buffer_config(extradata, extradata_size, format); | |
} | |
sp<Surface> nativeSurface(static_cast<android::Surface *>(sfdec->mNativeWindow.get())); | |
diff --git a/native/avos/external/android/libsfdec/sfdec_ndkmediacodec.cpp b/native/avos/external/android/libsfdec/sfdec_ndkmediacodec.cpp | |
index 176045b..302af83 100644 | |
--- a/native/avos/external/android/libsfdec/sfdec_ndkmediacodec.cpp | |
+++ b/native/avos/external/android/libsfdec/sfdec_ndkmediacodec.cpp | |
@@ -206,7 +206,7 @@ static ssize_t sfdec_send_input2(sfdec_priv_t *sfdec, void *data, size_t size, i | |
if (sfdec->flush) { | |
sfdec->flush = 0; | |
- if (sfdec->extradata && (sfdec->codec == SFDEC_VIDEO_AVC || sfdec->codec == SFDEC_VIDEO_HEVC || sfdec->codec == SFDEC_VIDEO_WMV)) | |
+ if (sfdec->extradata && (sfdec->codec == SFDEC_VIDEO_AVC || sfdec->codec == SFDEC_VIDEO_HEVC || sfdec->codec == SFDEC_VIDEO_WMV || sfdec->codec == SFDEC_VIDEO_DOLBY_VISION) ) | |
sfdec_send_input2(sfdec, sfdec->extradata, sfdec->extradata_size, 0, 0, 1, 2/* BUFFER_FLAG_CODECCONFIG (not exported)*/); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment