| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "media/formats/mp4/box_definitions.h" | 5 #include "media/formats/mp4/box_definitions.h" |
| 6 | 6 |
| 7 #include "base/logging.h" | 7 #include "base/logging.h" |
| 8 #include "media/base/video_types.h" |
| 9 #include "media/base/video_util.h" |
| 10 #include "media/formats/mp4/avc.h" |
| 8 #include "media/formats/mp4/es_descriptor.h" | 11 #include "media/formats/mp4/es_descriptor.h" |
| 9 #include "media/formats/mp4/rcheck.h" | 12 #include "media/formats/mp4/rcheck.h" |
| 10 | 13 |
| 14 #if defined(ENABLE_HEVC_DEMUXING) |
| 15 #include "media/formats/mp4/hevc.h" |
| 16 #endif |
| 17 |
| 11 namespace media { | 18 namespace media { |
| 12 namespace mp4 { | 19 namespace mp4 { |
| 13 | 20 |
| 14 FileType::FileType() {} | 21 FileType::FileType() {} |
| 15 FileType::~FileType() {} | 22 FileType::~FileType() {} |
| 16 FourCC FileType::BoxType() const { return FOURCC_FTYP; } | 23 FourCC FileType::BoxType() const { return FOURCC_FTYP; } |
| 17 | 24 |
| 18 bool FileType::Parse(BoxReader* reader) { | 25 bool FileType::Parse(BoxReader* reader) { |
| 19 RCHECK(reader->ReadFourCC(&major_brand) && reader->Read4(&minor_version)); | 26 RCHECK(reader->ReadFourCC(&major_brand) && reader->Read4(&minor_version)); |
| 20 size_t num_brands = (reader->size() - reader->pos()) / sizeof(FourCC); | 27 size_t num_brands = (reader->size() - reader->pos()) / sizeof(FourCC); |
| (...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 448 bool PixelAspectRatioBox::Parse(BoxReader* reader) { | 455 bool PixelAspectRatioBox::Parse(BoxReader* reader) { |
| 449 RCHECK(reader->Read4(&h_spacing) && | 456 RCHECK(reader->Read4(&h_spacing) && |
| 450 reader->Read4(&v_spacing)); | 457 reader->Read4(&v_spacing)); |
| 451 return true; | 458 return true; |
| 452 } | 459 } |
| 453 | 460 |
| 454 VideoSampleEntry::VideoSampleEntry() | 461 VideoSampleEntry::VideoSampleEntry() |
| 455 : format(FOURCC_NULL), | 462 : format(FOURCC_NULL), |
| 456 data_reference_index(0), | 463 data_reference_index(0), |
| 457 width(0), | 464 width(0), |
| 458 height(0) {} | 465 height(0), |
| 466 video_codec(kUnknownVideoCodec), |
| 467 video_codec_profile(VIDEO_CODEC_PROFILE_UNKNOWN) {} |
| 459 | 468 |
| 460 VideoSampleEntry::~VideoSampleEntry() {} | 469 VideoSampleEntry::~VideoSampleEntry() {} |
| 461 FourCC VideoSampleEntry::BoxType() const { | 470 FourCC VideoSampleEntry::BoxType() const { |
| 462 DCHECK(false) << "VideoSampleEntry should be parsed according to the " | 471 DCHECK(false) << "VideoSampleEntry should be parsed according to the " |
| 463 << "handler type recovered in its Media ancestor."; | 472 << "handler type recovered in its Media ancestor."; |
| 464 return FOURCC_NULL; | 473 return FOURCC_NULL; |
| 465 } | 474 } |
| 466 | 475 |
| 476 namespace { |
| 477 |
| 478 bool IsFormatValidH264(const FourCC& format, |
| 479 const ProtectionSchemeInfo& sinf) { |
| 480 return format == FOURCC_AVC1 || format == FOURCC_AVC3 || |
| 481 (format == FOURCC_ENCV && (sinf.format.format == FOURCC_AVC1 || |
| 482 sinf.format.format == FOURCC_AVC3)); |
| 483 } |
| 484 |
| 485 #if defined(ENABLE_HEVC_DEMUXING) |
| 486 bool IsFormatValidHEVC(const FourCC& format, |
| 487 const ProtectionSchemeInfo& sinf) { |
| 488 return format == FOURCC_HEV1 || format == FOURCC_HVC1 || |
| 489 (format == FOURCC_ENCV && (sinf.format.format == FOURCC_HEV1 || |
| 490 sinf.format.format == FOURCC_HVC1)); |
| 491 } |
| 492 #endif |
| 493 |
| 494 } |
| 495 |
| 467 bool VideoSampleEntry::Parse(BoxReader* reader) { | 496 bool VideoSampleEntry::Parse(BoxReader* reader) { |
| 468 format = reader->type(); | 497 format = reader->type(); |
| 469 RCHECK(reader->SkipBytes(6) && | 498 RCHECK(reader->SkipBytes(6) && |
| 470 reader->Read2(&data_reference_index) && | 499 reader->Read2(&data_reference_index) && |
| 471 reader->SkipBytes(16) && | 500 reader->SkipBytes(16) && |
| 472 reader->Read2(&width) && | 501 reader->Read2(&width) && |
| 473 reader->Read2(&height) && | 502 reader->Read2(&height) && |
| 474 reader->SkipBytes(50)); | 503 reader->SkipBytes(50)); |
| 475 | 504 |
| 476 RCHECK(reader->ScanChildren() && | 505 RCHECK(reader->ScanChildren() && |
| 477 reader->MaybeReadChild(&pixel_aspect)); | 506 reader->MaybeReadChild(&pixel_aspect)); |
| 478 | 507 |
| 479 if (format == FOURCC_ENCV) { | 508 if (format == FOURCC_ENCV) { |
| 480 // Continue scanning until a recognized protection scheme is found, or until | 509 // Continue scanning until a recognized protection scheme is found, or until |
| 481 // we run out of protection schemes. | 510 // we run out of protection schemes. |
| 482 while (sinf.type.type != FOURCC_CENC) { | 511 while (sinf.type.type != FOURCC_CENC) { |
| 483 if (!reader->ReadChild(&sinf)) | 512 if (!reader->ReadChild(&sinf)) |
| 484 return false; | 513 return false; |
| 485 } | 514 } |
| 486 } | 515 } |
| 487 | 516 |
| 488 if (IsFormatValid()) { | 517 if (IsFormatValidH264(format, sinf)) { |
| 518 DVLOG(2) << __FUNCTION__ |
| 519 << " reading AVCDecoderConfigurationRecord (avcC)"; |
| 489 scoped_ptr<AVCDecoderConfigurationRecord> avcConfig( | 520 scoped_ptr<AVCDecoderConfigurationRecord> avcConfig( |
| 490 new AVCDecoderConfigurationRecord()); | 521 new AVCDecoderConfigurationRecord()); |
| 491 RCHECK(reader->ReadChild(avcConfig.get())); | 522 RCHECK(reader->ReadChild(avcConfig.get())); |
| 492 frame_bitstream_converter = make_scoped_refptr( | 523 frame_bitstream_converter = make_scoped_refptr( |
| 493 new AVCBitstreamConverter(avcConfig.Pass())); | 524 new AVCBitstreamConverter(avcConfig.Pass())); |
| 525 video_codec = kCodecH264; |
| 526 video_codec_profile = H264PROFILE_MAIN; |
| 527 #if defined(ENABLE_HEVC_DEMUXING) |
| 528 } else if (IsFormatValidHEVC(format, sinf)) { |
| 529 DVLOG(2) << __FUNCTION__ |
| 530 << " parsing HEVCDecoderConfigurationRecord (hvcC)"; |
| 531 scoped_ptr<HEVCDecoderConfigurationRecord> hevcConfig( |
| 532 new HEVCDecoderConfigurationRecord()); |
| 533 RCHECK(reader->ReadChild(hevcConfig.get())); |
| 534 frame_bitstream_converter = make_scoped_refptr( |
| 535 new HEVCBitstreamConverter(hevcConfig.Pass())); |
| 536 video_codec = kCodecHEVC; |
| 537 #endif |
| 538 } else { |
| 539 // Unknown/unsupported format |
| 540 MEDIA_LOG(ERROR, reader->media_log()) << __FUNCTION__ |
| 541 << " unsupported video format " |
| 542 << FourCCToString(format); |
| 543 return false; |
| 494 } | 544 } |
| 495 | 545 |
| 496 return true; | 546 return true; |
| 497 } | 547 } |
| 498 | 548 |
| 499 bool VideoSampleEntry::IsFormatValid() const { | 549 bool VideoSampleEntry::IsFormatValid() const { |
| 500 return format == FOURCC_AVC1 || format == FOURCC_AVC3 || | 550 #if defined(ENABLE_HEVC_DEMUXING) |
| 501 (format == FOURCC_ENCV && (sinf.format.format == FOURCC_AVC1 || | 551 if (IsFormatValidHEVC(format, sinf)) |
| 502 sinf.format.format == FOURCC_AVC3)); | 552 return true; |
| 553 #endif |
| 554 return IsFormatValidH264(format, sinf); |
| 503 } | 555 } |
| 504 | 556 |
| 505 ElementaryStreamDescriptor::ElementaryStreamDescriptor() | 557 ElementaryStreamDescriptor::ElementaryStreamDescriptor() |
| 506 : object_type(kForbidden) {} | 558 : object_type(kForbidden) {} |
| 507 | 559 |
| 508 ElementaryStreamDescriptor::~ElementaryStreamDescriptor() {} | 560 ElementaryStreamDescriptor::~ElementaryStreamDescriptor() {} |
| 509 | 561 |
| 510 FourCC ElementaryStreamDescriptor::BoxType() const { | 562 FourCC ElementaryStreamDescriptor::BoxType() const { |
| 511 return FOURCC_ESDS; | 563 return FOURCC_ESDS; |
| 512 } | 564 } |
| (...skipping 474 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 987 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on( | 1039 SampleDependsOn IndependentAndDisposableSamples::sample_depends_on( |
| 988 size_t i) const { | 1040 size_t i) const { |
| 989 if (i >= sample_depends_on_.size()) | 1041 if (i >= sample_depends_on_.size()) |
| 990 return kSampleDependsOnUnknown; | 1042 return kSampleDependsOnUnknown; |
| 991 | 1043 |
| 992 return sample_depends_on_[i]; | 1044 return sample_depends_on_[i]; |
| 993 } | 1045 } |
| 994 | 1046 |
| 995 } // namespace mp4 | 1047 } // namespace mp4 |
| 996 } // namespace media | 1048 } // namespace media |
| OLD | NEW |