HbbTV uses AC-4 encrypted audio stream.
This patch is verified by HbbTV MediaSource/AC-4 TCs.
ref:
https://review.tizen.org/gerrit/#/c/platform/framework/web/chromium-efl/+/299413/
Change-Id: I62876758e84c9f35386f5388466846b76b504c15
Signed-off-by: yangzw <zw714.yang@samsung.com>
}
case kUnknownSampleFormat:
case kSampleFormatAc3:
+ case kSampleFormatAc4:
case kSampleFormatEac3:
case kSampleFormatMpegHAudio:
case kSampleFormatDts:
#endif
case AC4:
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ return true;
+#else
return false;
+#endif
}
return false;
}
#endif
- DVLOG(2) << __func__ << ": Unrecognized codec id \"" << codec_id << "\"";
+ LOG(ERROR) << __func__ << ": Unrecognized codec id \"" << codec_id << "\"";
return false;
}
case kSampleFormatDts:
case kSampleFormatDtsxP2:
case kSampleFormatDtse:
+ case kSampleFormatAc4:
return 1;
case kSampleFormatS16:
case kSampleFormatPlanarS16:
return "IEC-61937 encapsulated DTS bitstream";
case kSampleFormatDtse:
return "Compressed DTS Express bitstream";
+ case kSampleFormatAc4:
+ return "Compressed AC4 bitstream";
}
NOTREACHED() << "Invalid sample format provided: " << sample_format;
return "";
case kSampleFormatDtsxP2:
case kSampleFormatIECDts:
case kSampleFormatDtse:
+ case kSampleFormatAc4:
return false;
}
case kSampleFormatDtsxP2:
case kSampleFormatIECDts:
case kSampleFormatDtse:
+ case kSampleFormatAc4:
return true;
case kUnknownSampleFormat:
case kSampleFormatPlanarU8:
// kSampleFormatS16, so it will return false. If bit-stream passthrough
// is required, the sample format would already be
// kSampleFormatDts/DtsxP2. In this case, it should return true as below.
+ case kSampleFormatAc4:
return true;
case kUnknownSampleFormat:
case kSampleFormatU8:
kSampleFormatDtsxP2, // Compressed DTSX audio bitstream.
kSampleFormatIECDts, // IEC-61937 encapsulated DTS audio bitstream.
kSampleFormatDtse, // Compressed DTS Express audio bitstream.
+ kSampleFormatAc4, // Compressed AC4 bitstream.
// Must always be equal to largest value ever logged.
- kSampleFormatMax = kSampleFormatDtse,
+ kSampleFormatMax = kSampleFormatAc4,
};
// Returns the number of bytes used per channel for the specified
case AudioCodec::kALAC:
case AudioCodec::kMpegHAudio:
case AudioCodec::kAC4:
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ return true;
+#endif
case AudioCodec::kUnknown:
return false;
case AudioCodec::kDTS:
return AudioCodec::kAC3;
case AV_CODEC_ID_EAC3:
return AudioCodec::kEAC3;
+#endif
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ case AV_CODEC_ID_AC4:
+ return AudioCodec::kAC4;
#endif
case AV_CODEC_ID_MP3:
return AudioCodec::kMP3;
sample_format = kSampleFormatMpegHAudio;
break;
#endif
-
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ case AudioCodec::kAC4:
+ // The spec for AC4 audio is ETSI TS 103 190-1. According to sections
+ // E.3 in that spec the sample_format for AC4 must be 16.
+ sample_format = kSampleFormatS16;
+ break;
+#endif
default:
break;
}
if (codec == AudioCodec::kAC3 || codec == AudioCodec::kEAC3)
return true;
#endif
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ if (codec == AudioCodec::kAC4)
+ return true;
+#endif
#if BUILDFLAG(ENABLE_PLATFORM_MPEG_H_AUDIO)
if (codec == AudioCodec::kMpegHAudio)
return true;
HISTOGRAM_DTS,
HISTOGRAM_DTSXP2,
HISTOGRAM_DTSE,
- HISTOGRAM_MAX = HISTOGRAM_DTSE // Must be equal to largest logged entry.
+ HISTOGRAM_AC4,
+ HISTOGRAM_MAX = HISTOGRAM_AC4 // Must be equal to largest logged entry.
};
const char* pattern;
"mha1.*", CodecInfo::AUDIO, nullptr, CodecInfo::HISTOGRAM_MPEG_H_AUDIO};
#endif
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+static const CodecInfo kAC4CodecInfo1 = {"ac-4*", CodecInfo::AUDIO, nullptr,
+ CodecInfo::HISTOGRAM_AC4};
+#endif
+
#endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
static const CodecInfo kMP3CodecInfo = {nullptr, CodecInfo::AUDIO, nullptr,
&kEAC3CodecInfo2,
&kEAC3CodecInfo3,
#endif // BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ &kAC4CodecInfo1,
+#endif // BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
&kDTSCodecInfo1,
&kDTSCodecInfo2,
base::MatchPattern(codec_id, kEAC3CodecInfo3.pattern)) {
audio_object_types.insert(mp4::kEAC3);
#endif // BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ } else if (base::MatchPattern(codec_id, kAC4CodecInfo1.pattern)) {
+ audio_object_types.insert(mp4::kAC4);
+#endif // BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
} else if (base::MatchPattern(codec_id, kDTSCodecInfo1.pattern) ||
base::MatchPattern(codec_id, kDTSCodecInfo2.pattern) ||
kEAC3 = 0xa6, // EAC3 / Dolby Digital Plus
kDTS = 0xa9, // DTS
kDTSE = 0xac, // DTS Express/LBR
- kDTSX = 0xb2 // DTS:X
+ kDTSX = 0xb2, // DTS:X
+ kAC4 = 0xae // AC4
};
enum Tag {
FOURCC_EAC3 = 0x65632d33, // "ec-3"
FOURCC_DEC3 = 0x64656333, // "dec3"
#endif
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ FOURCC_AC4 = 0x61632d34, // "ac-4"
+#endif
#if BUILDFLAG(ENABLE_AV1_DECODER)
FOURCC_AV01 = 0x61763031, // "av01"
FOURCC_AV1C = 0x61763143, // "av1C"
#if BUILDFLAG(ENABLE_PLATFORM_AC3_EAC3_AUDIO)
audio_format != FOURCC_AC3 && audio_format != FOURCC_EAC3 &&
#endif
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ audio_format != FOURCC_AC4 &&
+#endif
#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
audio_format != FOURCC_DTSC && audio_format != FOURCC_DTSX &&
audio_format != FOURCC_DTSE &&
audio_format != FOURCC_MHM1 && audio_format != FOURCC_MHA1 &&
#endif
audio_format != FOURCC_MP4A) {
- MEDIA_LOG(ERROR, media_log_)
- << "Unsupported audio format 0x" << std::hex << entry.format
- << " in stsd box.";
+ LOG(ERROR) << "Unsupported audio format 0x" << std::hex << entry.format
+ << " in stsd box.";
return false;
}
audio_type = kEAC3;
}
#endif
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ if (audio_type == kForbidden) {
+ if (audio_format == FOURCC_AC4)
+ audio_type = kAC4;
+ }
+#endif
#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
if (audio_type == kForbidden) {
if (audio_format == FOURCC_DTSC)
GuessChannelLayout(entry.eac3.dec3.GetChannelCount());
sample_per_second = entry.samplerate;
#endif
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ } else if (audio_type == kAC4) {
+ codec = AudioCodec::kAC4;
+ channel_layout = GuessChannelLayout(entry.channelcount);
+ channel_layout = channel_layout == CHANNEL_LAYOUT_UNSUPPORTED
+ ? CHANNEL_LAYOUT_BITSTREAM
+ : channel_layout;
+ sample_per_second = entry.samplerate;
+#endif
#if BUILDFLAG(ENABLE_PLATFORM_DTS_AUDIO)
} else if (audio_type == kDTS) {
codec = AudioCodec::kDTS;
sample_per_second = entry.samplerate;
#endif
} else {
- MEDIA_LOG(ERROR, media_log_)
- << "Unsupported audio object type 0x" << std::hex
- << static_cast<int>(audio_type) << " in esds.";
+ LOG(ERROR) << "Unsupported audio object type 0x" << std::hex
+ << static_cast<int>(audio_type) << " in esds.";
return false;
}
#endif // BUILDFLAG(USE_PROPRIETARY_CODECS)
}
if (audio) {
+ FourCC audio_format = (runs_->audio_description().format == FOURCC_ENCA)
+ ? runs_->audio_description().sinf.format.format
+ : runs_->audio_description().format;
+ uint8_t audio_type = runs_->audio_description().esds.object_type;
+#if BUILDFLAG(ENABLE_PLATFORM_AC4_AUDIO)
+ if (audio_type == kForbidden) {
+ if (audio_format == FOURCC_AC4)
+ audio_type = kAC4;
+ }
+#endif
if (ESDescriptor::IsAAC(runs_->audio_description().esds.object_type)) {
#if BUILDFLAG(USE_PROPRIETARY_CODECS)
if (!PrepareAACBuffer(runs_->audio_description().esds.aac, &frame_buf,
# Enables AC4 audio handling in chromium. This includes demuxing,
# on-device decoding and bitstream passthrough as supported by device.
- enable_platform_ac4_audio = false
+ enable_platform_ac4_audio = proprietary_codecs && (is_cast_media_device || tizen_product_tv)
- enable_platform_mpeg_h_audio = proprietary_codecs && is_cast_media_device
+ enable_platform_mpeg_h_audio = proprietary_codecs && (is_cast_media_device || tizen_product_tv)
# Enables DTS/DTSX audio handling in chromium. This includes demuxing,
# on-device decoding and bitstream passthrough as supported by device.
case media::AudioCodec::kAC3:
audioMimeType = ESPLUSPLAYER_AUDIO_MIME_TYPE_AC3;
break;
+#if BUILDFLAG(IS_TIZEN_TV)
+ case media::AudioCodec::kAC4:
+ audioMimeType = ESPLUSPLAYER_AUDIO_MIME_TYPE_AC4;
+ break;
+#endif
#if BUILDFLAG(IS_TIZEN_TV) && TIZEN_VERSION_AT_LEAST(8, 0, 0)
case media::AudioCodec::kFLAC:
audioMimeType = ESPLUSPLAYER_AUDIO_MIME_TYPE_FLAC;