Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1050)

Side by Side Diff: media/base/mime_util.cc

Issue 812643005: Re-add AC3/EAC3 audio demuxing support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Move CanPlay tests into _mp4 test case Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include <map> 5 #include <map>
6 6
7 #include "base/containers/hash_tables.h" 7 #include "base/containers/hash_tables.h"
8 #include "base/lazy_instance.h" 8 #include "base/lazy_instance.h"
9 #include "base/strings/string_number_conversions.h" 9 #include "base/strings/string_number_conversions.h"
10 #include "base/strings/string_split.h" 10 #include "base/strings/string_split.h"
(...skipping 22 matching lines...) Expand all
33 MPEG4_AAC_SBR_PS_v2, 33 MPEG4_AAC_SBR_PS_v2,
34 VORBIS, 34 VORBIS,
35 OPUS, 35 OPUS,
36 H264_BASELINE, 36 H264_BASELINE,
37 H264_MAIN, 37 H264_MAIN,
38 H264_HIGH, 38 H264_HIGH,
39 HEVC_MAIN, 39 HEVC_MAIN,
40 VP8, 40 VP8,
41 VP9, 41 VP9,
42 THEORA 42 THEORA
43 #if defined(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
ddorwin 2015/11/25 22:24:08 Do we need to ifdef this? There are other propriet
servolk 2015/12/03 00:56:14 Done.
44 ,
45 AC3,
ddorwin 2015/11/25 22:24:08 Regardless, keep similar types (at least audio) to
servolk 2015/12/03 00:56:15 Done.
46 EAC3
47 #endif
43 }; 48 };
44 49
45 bool IsSupportedMediaMimeType(const std::string& mime_type) const; 50 bool IsSupportedMediaMimeType(const std::string& mime_type) const;
46 51
47 bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const; 52 bool AreSupportedMediaCodecs(const std::vector<std::string>& codecs) const;
48 53
49 void ParseCodecString(const std::string& codecs, 54 void ParseCodecString(const std::string& codecs,
50 std::vector<std::string>* codecs_out, 55 std::vector<std::string>* codecs_out,
51 bool strip); 56 bool strip);
52 57
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 #else 215 #else
211 return false; 216 return false;
212 #endif 217 #endif
213 218
214 case MimeUtil::MPEG2_AAC_LC: 219 case MimeUtil::MPEG2_AAC_LC:
215 case MimeUtil::MPEG2_AAC_MAIN: 220 case MimeUtil::MPEG2_AAC_MAIN:
216 case MimeUtil::MPEG2_AAC_SSR: 221 case MimeUtil::MPEG2_AAC_SSR:
217 // MPEG-2 variants of AAC are not supported on Android. 222 // MPEG-2 variants of AAC are not supported on Android.
218 return false; 223 return false;
219 224
225 #if defined(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
226 case MimeUtil::AC3:
227 case MimeUtil::EAC3:
228 // TODO(servolk): Revisit this for AC3/EAC3 support on AndroidTV
229 return false;
230 #endif
231
220 case MimeUtil::VP9: 232 case MimeUtil::VP9:
221 // VP9 is supported only in KitKat+ (API Level 19). 233 // VP9 is supported only in KitKat+ (API Level 19).
222 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19; 234 return base::android::BuildInfo::GetInstance()->sdk_int() >= 19;
223 235
224 case MimeUtil::OPUS: 236 case MimeUtil::OPUS:
225 // Opus is supported only in Lollipop+ (API Level 21). 237 // Opus is supported only in Lollipop+ (API Level 21).
226 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21; 238 return base::android::BuildInfo::GetInstance()->sdk_int() >= 21;
227 239
228 case MimeUtil::THEORA: 240 case MimeUtil::THEORA:
229 return false; 241 return false;
(...skipping 19 matching lines...) Expand all
249 // mp4a.40.5 - MPEG-4 HE-AAC v1 (AAC LC + SBR) 261 // mp4a.40.5 - MPEG-4 HE-AAC v1 (AAC LC + SBR)
250 // mp4a.40.05 - MPEG-4 HE-AAC v1 (AAC LC + SBR) (leading 0 in aud-oti for 262 // mp4a.40.05 - MPEG-4 HE-AAC v1 (AAC LC + SBR) (leading 0 in aud-oti for
251 // compatibility) 263 // compatibility)
252 // mp4a.40.29 - MPEG-4 HE-AAC v2 (AAC LC + SBR + PS) 264 // mp4a.40.29 - MPEG-4 HE-AAC v2 (AAC LC + SBR + PS)
253 // 265 //
254 // avc1.42E0xx - H.264 Baseline 266 // avc1.42E0xx - H.264 Baseline
255 // avc1.4D40xx - H.264 Main 267 // avc1.4D40xx - H.264 Main
256 // avc1.6400xx - H.264 High 268 // avc1.6400xx - H.264 High
257 static const char kMP4AudioCodecsExpression[] = 269 static const char kMP4AudioCodecsExpression[] =
258 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," 270 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5,"
271 #if defined(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
272 "ac-3,ec-3," // Note: only one variant of eac codec string is sufficient
ddorwin 2015/11/25 22:24:08 Same as the next comment.
servolk 2015/12/03 00:56:15 Done.
273 // here since these are converted into enums in
274 // InitializeMimeTypeMaps
275 #endif
259 "mp4a.40.05,mp4a.40.29"; 276 "mp4a.40.05,mp4a.40.29";
260 static const char kMP4VideoCodecsExpression[] = 277 static const char kMP4VideoCodecsExpression[] =
261 // This is not a complete list of supported avc1 codecs. It is simply used 278 // This is not a complete list of supported avc1 codecs. It is simply used
262 // to register support for the corresponding Codec enum. Instead of using 279 // to register support for the corresponding Codec enum. Instead of using
263 // strings in these three arrays, we should use the Codec enum values. 280 // strings in these three arrays, we should use the Codec enum values.
264 // This will avoid confusion and unnecessary parsing at runtime. 281 // This will avoid confusion and unnecessary parsing at runtime.
265 // kUnambiguousCodecStringMap/kAmbiguousCodecStringMap should be the only 282 // kUnambiguousCodecStringMap/kAmbiguousCodecStringMap should be the only
266 // mapping from strings to codecs. See crbug.com/461009. 283 // mapping from strings to codecs. See crbug.com/461009.
267 "avc1.42E00A,avc1.4D400A,avc1.64000A," 284 "avc1.42E00A,avc1.4D400A,avc1.64000A,"
268 #if defined(ENABLE_HEVC_DEMUXING) 285 #if defined(ENABLE_HEVC_DEMUXING)
269 // Any valid unambiguous HEVC codec id will work here, since these strings 286 // Any valid unambiguous HEVC codec id will work here, since these strings
270 // are parsed and mapped to MimeUtil::Codec enum values. 287 // are parsed and mapped to MimeUtil::Codec enum values.
271 "hev1.1.6.L93.B0," 288 "hev1.1.6.L93.B0,"
272 #endif 289 #endif
273 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5," 290 "mp4a.66,mp4a.67,mp4a.68,mp4a.69,mp4a.6B,mp4a.40.2,mp4a.40.02,mp4a.40.5,"
291 #if defined(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
292 "ac-3,ec-3," // Note: only one variant of eac codec string is sufficient
ddorwin 2015/11/25 22:24:08 Here and above, be consistent with existing text a
servolk 2015/12/03 00:56:15 Done.
293 // here since these are converted into enums in
294 // InitializeMimeTypeMaps
295 #endif
274 "mp4a.40.05,mp4a.40.29"; 296 "mp4a.40.05,mp4a.40.29";
275 297
276 // These containers are also included in 298 // These containers are also included in
277 // common_media_types/proprietary_media_types. See crbug.com/461012. 299 // common_media_types/proprietary_media_types. See crbug.com/461012.
278 static const MediaFormatStrict format_codec_mappings[] = { 300 static const MediaFormatStrict format_codec_mappings[] = {
279 {"video/webm", "opus,vorbis,vp8,vp8.0,vp9,vp9.0"}, 301 {"video/webm", "opus,vorbis,vp8,vp8.0,vp9,vp9.0"},
280 {"audio/webm", "opus,vorbis"}, 302 {"audio/webm", "opus,vorbis"},
281 {"audio/wav", "1"}, 303 {"audio/wav", "1"},
282 {"audio/x-wav", "1"}, 304 {"audio/x-wav", "1"},
283 // Android does not support Opus in Ogg container. 305 // Android does not support Opus in Ogg container.
(...skipping 10 matching lines...) Expand all
294 {"audio/mp3", ""}, 316 {"audio/mp3", ""},
295 {"audio/x-mp3", ""}, 317 {"audio/x-mp3", ""},
296 {"audio/aac", ""}, 318 {"audio/aac", ""},
297 {"audio/mp4", kMP4AudioCodecsExpression}, 319 {"audio/mp4", kMP4AudioCodecsExpression},
298 {"audio/x-m4a", kMP4AudioCodecsExpression}, 320 {"audio/x-m4a", kMP4AudioCodecsExpression},
299 {"video/mp4", kMP4VideoCodecsExpression}, 321 {"video/mp4", kMP4VideoCodecsExpression},
300 {"video/x-m4v", kMP4VideoCodecsExpression}, 322 {"video/x-m4v", kMP4VideoCodecsExpression},
301 #if defined(ENABLE_MPEG2TS_STREAM_PARSER) 323 #if defined(ENABLE_MPEG2TS_STREAM_PARSER)
302 {"video/mp2t", kMP4VideoCodecsExpression}, 324 {"video/mp2t", kMP4VideoCodecsExpression},
303 #endif 325 #endif
304 {"application/x-mpegurl", kMP4VideoCodecsExpression}, 326 {"application/x-mpegurl", kMP4VideoCodecsExpression},
ddorwin 2015/11/25 22:24:08 Do you want to support this in HLS? The current co
servolk 2015/12/03 00:56:14 HLS is only enabled on Clank/Android, where AC3/EA
305 {"application/vnd.apple.mpegurl", kMP4VideoCodecsExpression}}; 327 {"application/vnd.apple.mpegurl", kMP4VideoCodecsExpression}};
306 328
307 struct CodecIDMappings { 329 struct CodecIDMappings {
308 const char* const codec_id; 330 const char* const codec_id;
309 MimeUtil::Codec codec; 331 MimeUtil::Codec codec;
310 }; 332 };
311 333
312 // List of codec IDs that provide enough information to determine the 334 // List of codec IDs that provide enough information to determine the
313 // codec and profile being requested. 335 // codec and profile being requested.
314 // 336 //
315 // The "mp4a" strings come from RFC 6381. 337 // The "mp4a" strings come from RFC 6381.
316 static const CodecIDMappings kUnambiguousCodecStringMap[] = { 338 static const CodecIDMappings kUnambiguousCodecStringMap[] = {
317 {"1", MimeUtil::PCM}, // We only allow this for WAV so it isn't ambiguous. 339 {"1", MimeUtil::PCM}, // We only allow this for WAV so it isn't ambiguous.
318 // avc1/avc3.XXXXXX may be unambiguous; handled by ParseH264CodecID(). 340 // avc1/avc3.XXXXXX may be unambiguous; handled by ParseH264CodecID().
ddorwin 2015/11/25 22:24:08 Please add a similar comment for HEVC.
319 {"mp3", MimeUtil::MP3}, 341 {"mp3", MimeUtil::MP3},
320 {"mp4a.66", MimeUtil::MPEG2_AAC_MAIN}, 342 {"mp4a.66", MimeUtil::MPEG2_AAC_MAIN},
321 {"mp4a.67", MimeUtil::MPEG2_AAC_LC}, 343 {"mp4a.67", MimeUtil::MPEG2_AAC_LC},
322 {"mp4a.68", MimeUtil::MPEG2_AAC_SSR}, 344 {"mp4a.68", MimeUtil::MPEG2_AAC_SSR},
323 {"mp4a.69", MimeUtil::MP3}, 345 {"mp4a.69", MimeUtil::MP3},
324 {"mp4a.6B", MimeUtil::MP3}, 346 {"mp4a.6B", MimeUtil::MP3},
325 {"mp4a.40.2", MimeUtil::MPEG4_AAC_LC}, 347 {"mp4a.40.2", MimeUtil::MPEG4_AAC_LC},
326 {"mp4a.40.02", MimeUtil::MPEG4_AAC_LC}, 348 {"mp4a.40.02", MimeUtil::MPEG4_AAC_LC},
327 {"mp4a.40.5", MimeUtil::MPEG4_AAC_SBR_v1}, 349 {"mp4a.40.5", MimeUtil::MPEG4_AAC_SBR_v1},
328 {"mp4a.40.05", MimeUtil::MPEG4_AAC_SBR_v1}, 350 {"mp4a.40.05", MimeUtil::MPEG4_AAC_SBR_v1},
329 {"mp4a.40.29", MimeUtil::MPEG4_AAC_SBR_PS_v2}, 351 {"mp4a.40.29", MimeUtil::MPEG4_AAC_SBR_PS_v2},
352 #if defined(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
353 {"ac-3", MimeUtil::AC3},
354 {"ec-3", MimeUtil::EAC3},
ddorwin 2015/11/25 22:24:07 group the codecs together
servolk 2015/12/03 00:56:15 Done.
355 {"mp4a.a5", MimeUtil::AC3},
356 {"mp4a.A5", MimeUtil::AC3},
ddorwin 2015/11/25 22:24:08 Why both cases? Is one not "correct?" With everyth
servolk 2015/12/03 00:56:15 I've copied the comment from the unit test that re
357 {"mp4a.a6", MimeUtil::EAC3},
358 {"mp4a.A6", MimeUtil::EAC3},
359 #endif
330 {"vorbis", MimeUtil::VORBIS}, 360 {"vorbis", MimeUtil::VORBIS},
331 {"opus", MimeUtil::OPUS}, 361 {"opus", MimeUtil::OPUS},
332 {"vp8", MimeUtil::VP8}, 362 {"vp8", MimeUtil::VP8},
333 {"vp8.0", MimeUtil::VP8}, 363 {"vp8.0", MimeUtil::VP8},
334 {"vp9", MimeUtil::VP9}, 364 {"vp9", MimeUtil::VP9},
335 {"vp9.0", MimeUtil::VP9}, 365 {"vp9.0", MimeUtil::VP9},
336 {"theora", MimeUtil::THEORA}}; 366 {"theora", MimeUtil::THEORA}};
337 367
338 // List of codec IDs that are ambiguous and don't provide 368 // List of codec IDs that are ambiguous and don't provide
339 // enough information to determine the codec and profile. 369 // enough information to determine the codec and profile.
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 #if defined(OS_ANDROID) 719 #if defined(OS_ANDROID)
690 if (!IsCodecSupportedOnAndroid(codec)) 720 if (!IsCodecSupportedOnAndroid(codec))
691 return false; 721 return false;
692 #endif 722 #endif
693 723
694 return allow_proprietary_codecs_ || !IsCodecProprietary(codec); 724 return allow_proprietary_codecs_ || !IsCodecProprietary(codec);
695 } 725 }
696 726
697 bool MimeUtil::IsCodecProprietary(Codec codec) const { 727 bool MimeUtil::IsCodecProprietary(Codec codec) const {
698 switch (codec) { 728 switch (codec) {
729 #if defined(ENABLE_AC3_EAC3_AUDIO_DEMUXING)
ddorwin 2015/11/25 22:24:08 ditto and match order of enum.
servolk 2015/12/03 00:56:15 Done.
730 case AC3:
731 case EAC3:
732 #endif
699 case INVALID_CODEC: 733 case INVALID_CODEC:
700 case MP3: 734 case MP3:
701 case MPEG2_AAC_LC: 735 case MPEG2_AAC_LC:
702 case MPEG2_AAC_MAIN: 736 case MPEG2_AAC_MAIN:
703 case MPEG2_AAC_SSR: 737 case MPEG2_AAC_SSR:
704 case MPEG4_AAC_LC: 738 case MPEG4_AAC_LC:
705 case MPEG4_AAC_SBR_v1: 739 case MPEG4_AAC_SBR_v1:
706 case MPEG4_AAC_SBR_PS_v2: 740 case MPEG4_AAC_SBR_PS_v2:
707 case H264_BASELINE: 741 case H264_BASELINE:
708 case H264_MAIN: 742 case H264_MAIN:
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
770 std::vector<std::string>* codecs_out, 804 std::vector<std::string>* codecs_out,
771 const bool strip) { 805 const bool strip) {
772 g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip); 806 g_media_mime_util.Get().ParseCodecString(codecs, codecs_out, strip);
773 } 807 }
774 808
775 void RemoveProprietaryMediaTypesAndCodecsForTests() { 809 void RemoveProprietaryMediaTypesAndCodecsForTests() {
776 g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests(); 810 g_media_mime_util.Get().RemoveProprietaryMediaTypesAndCodecsForTests();
777 } 811 }
778 812
779 } // namespace media 813 } // namespace media
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698