Skip to content

Instantly share code, notes, and snippets.

@phhusson
Created February 15, 2021 22:44
Show Gist options
  • Save phhusson/d2dcfe685af303ac2d85e8ecbc87f2cd to your computer and use it in GitHub Desktop.
Save phhusson/d2dcfe685af303ac2d85e8ecbc87f2cd to your computer and use it in GitHub Desktop.
NOVA/AVOS Dolby Vision support
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