This is part of the effort to support Opus in iso-bmff #83.
Changes in this CL:
- Add support for multiple SampleGroupDescription and SampleToGroup
boxes in TrackFragment box;
- Add support for SampleGroupDescription and SampleToGroup boxes
in SampleTable box;
- Add support for AudioRollRecoveryEntry in Sample Group and 'roll'
sample grouping type;
- Also fix a bug that default length was not set correctly in
SampleGroupDescription when constant iv is used.
Change-Id: I7e31386ea6cd17a8ee5e1dca4c1a90937d51368f
- For encrypted segments, PMT specified by SAMPLE-AES specification is
generated.
- Remove time_scale_ field from TsWriter. It is not used.
- Move ContinuityCounter to a separate file.
- Add ProgramMapTableWriter and implementations.
- continuity_counter is incremented for PAT and PMT.
Change-Id: If0dd0990203cb6990f39a6832048bdc3ff08decd
This add several unit tests for EsParserH26x to test the various
NAL unit orders and access unit contents. Some tests are disabled
and will be fixed in another patch.
Change-Id: Id5e3291e22f1fe17ada2c03c42e2cdfe226abcb2
- BytesOfProtectedData in 'cens' SHALL also be 16-byte aligned
- Fix an incorrect box definition bug w.r.t to 'cbcs' and 'cens'
- Also add various protection scheme tests
Close#77Close#78
Change-Id: I63c8d8b01ce16ed60affa97ec95fc62bc2da06df
- These warning messages are not useful since the code needs to
loop through various container types to find a matching one.
Change-Id: I1d8eca563faf24e485ac71cce32e09515c174bf2
Replaces the InitializeFromH264 and InitializeFromH265 methods with
a single Initialize method that accepts a CodecType. Also moves the
CodecType enum from NaluReader to Nalu.
Change-Id: Ie33aa9c0d772a7f3c6a2e9c867e25be3edfe7828
- CBC cryptors should accept IV of size 8 bytes - it will be zero
extended to 16 bytes.
- Fixed iv() not updated problem in AesPatternCryptor.
- Replace kChainAcrossCalls with ConstantIvFlag enum flags.
Change-Id: I3fb4de0e8abbe891e6271e779373ba53f8df660d
- Sample duration wasn't scaled in TsSegmenter to calculate the current
segment's length. So segmenting length did not always respect
segment_duration.
Change-Id: I1ef4747dbd12bde7852ffcbceb971f2775aa18b3
Parsing vui_parameters in the SPS is required to be able to extract
the resolution of the video. This also adds a method to extract
the resolution to the H.265 parser.
Issue #46
Change-Id: Idf498d2afdb36a689490151a4ae6baef0b6b73f6
Now Finalize() will close all the files used by the segmenters. This
is important to allow WebMMuxer::FireOnMediaEndEvent to get the
correct size of the media file.
This also changes the WebM muxer to use 64-bit numbers for the init
and index ranges to correctly support >4GB files.
b/28194272
Change-Id: Ia84e4a4b0756f89644efea99a1a51968b22a1338
- Add hls_name and hls_group_id fields to MuxerOptions. This is used to
pass the NAME and GROUP-ID values for EXT-X-MEDIA tag to
MuxerListener.
- Change MuxerListener::OnEncryptionInfoReady() to take an
initialization vector.
- Change MuxerListener::OnNewSegment() to take segment name.
- Reworded and formatted MuxerListener comments to Doxygen style.
Issue #85
Change-Id: Iea06e68552a56ae180177ffd6ca315a7cf39456c
- crypt_byte_block and skip_byte_block for pattern-based encryption.
- constant_iv for constant iv (used by 'cbcs' protection scheme).
- Also renamed iv_size to per_sample_iv_size.
- Also changed "bool is_encrypted" to "uint8_t is_protected" to align
with CENC spec.
Issue #78
Change-Id: I2878a91e0ebe536a08a3e3109daf157fe4440e27
- Remove EncryptionMode enums
- Remove AesEncryptor::InitializeWithRandomIv, replaced with
a static function AesCryptor::GenerateRandomIv, which should
be called to generate the iv if the iv is empty.
This change is to prepare support for CBCS and CENS pattern-based
protection schemes.
Issue #77
Change-Id: Icba35089d6e451cbea7ebbf5dd5674079f206390
- FOURCC is not a mp4 only concept. It is also used elsewhere.
- RCHECK has been used outside formats/mp4.
Also updated the FOURCC enum names to match the actual fourcc code, e.g.
FOURCC_mdat for "mdat".
Change-Id: I5be02f12695882c0fb41d359305fb8ec01303a06
- Create AesCryptor class as the common base
- AesCryptor::Crypt function will serve as an Encrypt function for
encryptor and a Decrypt function for Decryptor.
Change-Id: Ie91fb14964b5091786705bf510656f40d73af160
- Simple implementation of MPEG2 TS muxer.
- This does not take MuxerListener so a manifest cannot be generated.
- Encryption is not supported.
Issue #84
Change-Id: I117b772dbbce5437398defbd564883ad758916d5
- Segmenter should not finish a segment unless the next sample is a key
frame.
- Renamed PesPacketGenerator::Finalize() to Flush().
- Use duration from the sample instead of the one copied to PesPacket.
- Remove duration field from PesPacket.
Issue #84
Change-Id: Icd90e65fd63fdeb955e7abac3473b0b54db6ac4a
- Multi-file segmenter implementation.
- The samples are passed to PesPacketGenerator to generate PesPackets.
PesPackets are passed to TsWriter to write them to file.
Issue #84
Change-Id: Ia4cae2abe2e7df46016dcdb791baaab2818aea03
The positions in the SeekHead element should be relative to the
Segment payload, not the start of the file. Also added entries for
Tracks and SegmentInfo.
Change-Id: Id692da25fffc27d78e9f1a06d061431aeb6f1e7c
- Optimize and clean up encryption and decryption code.
- Consolidate various CBC encryption/decryption schemes into a
common class.
- Make it a constructor argument whether cipher block chain is
continuous across Encrypt/Decrypt calls.
- Also align protected region size as required in CENC spec.
Issue #77
Change-Id: I533d92ada3cd80933b532b9c3a1cca105ba66f8e
Another feature that the mac build does not support. It incorrectly
uses a copy-constructor when creating new values in a std::map. This
is incorrect and should use an in-place constructor with C++11.
Change-Id: I1e822747e97eb4ae01596d63ea05058cc383cb49
This adds a preliminary H.265 parser. The parser only support
reading the slice header. This also attaches the H.265 parser to the
VideoSliceHeaderReader so H.265 frames can have unencrypted headers.
Issue #46Closes#40
Change-Id: I8b98e1f8bb04e359d9bf896fd5b2939c326b196b
The flag --include_common_pssh will add another PSSH box in addition
to the Widevine one which will contain the key IDs of all the keys.
Closes#88
Change-Id: Ic719b19747530f0e4856cfb36471a644d572a734
The new algorithm will parse NAL unit header and only starts a new
NAL unit if it is valid, otherwise it will be considered part of
the previous NAL unit.
Closes#96
Change-Id: I45f2a0f37d51841ee8345d6d0d38fcda57e0a009
KeySource is now an abstract class that is implemented in two
types WidevineKeySource and FixedKeySource. This also updates
fixed key encryption to use v1 PSSH boxes with the common system
ID.
This also updates the --pssh argument. Now it accepts full PSSH
boxes rather than data. Multiple PSSH boxes can be concatenated
together.
Issue #88
Change-Id: I4bd0290f6d8b965f7d118f075c96e0f267d7e831
- Part 1.
- Add packager command line argument "protection_scheme" to specify
protection scheme. Plumb through packager code to enable CBC
encryption/decryption.
- Add scheme type "cbc1" to sinf.
- Refactor AES encryptor and decryptor.
- Need more work in the subsample handling.
Issue #77
Change-Id: I3a9304d89adf5efbfb226b6e805a3077b6cb8c68
* EncryptionKey now contains them rather than a PSSH box.
* Outputs PSSH boxes for each entry.
* Outputs a ContentProtection element for each entry.
* Removed SystemName and UUID from KeySource.
* Removed --scheme_id_uri packager argument.
Issue #88
Change-Id: I2651784c3220fd64f5b1773fdcd70285690cf8c0
When normalizing language tags to their shortest form, we need to
split off subtags and treat them as separate components that do not
get changed.
Furthermore, MP4 can only store language tags without subtags. So
only store the main language in MP4 output.
Fixes b/27533973
Change-Id: I96049e274aae9841e321c53039ef6464a2e61574
Add another overload to fetch by key ID directly, used by WebM.
Changed the one using PSSH data in favor of the entire PSSH box.
This also moves the Widevine proto to media base. Now, the
Widevine key source handles creating the Widevine specific PSSH
data.
Change-Id: I6f4633facad39207809ffbad970635d1f9d70983
This moves pssh parsing to its own class in media base. This type
can be used to parse and generate pssh boxes. This new type also
supports both v0 an v1 boxes.
This also modifies the pssh box definition to only have the |raw_box|
and moves all pssh parsing and handling into mp4 media parser.
A follow-up change will replace the remaining usages of 'raw' pssh
box data with the new type.
Issue #88
Change-Id: Ic2436ecb5df8b3558b81e600dc095b0efd122ab1
This moves common parsing code out of the H.264 parser. This is in
preparation for the H.265 parser to use.
Change-Id: Id05b55f6adc2ea31e97c8a9f22023e851808a8a7
Now the AVCDecoderConfiguration and HEVCDecoderConfiguration classes
will read the Nalu from the blocks, meaning they will store a
vector of Nalu objects for the data.
Also added H.265 to the Nalu class and added argument to NaluReader
to read H.264 vs H.265 Nalus.
Change-Id: I8d8194a90fd72a30af66e9776e01379f8428542c
This is needed to test encryption in end to end test since the video
is segmented in gop boundary by default. Due to the existence of clear
lead, the first segment is always left in clear.
Change-Id: Ie8d37a1740f9061515298cb9fb7b58983592cc5b
This member refers to the size of the payload (the data after the
header). Since the pointer is called |data|, calling this size
|data_size| is confusing.
Change-Id: I9174cf6c5c402beddaebbce7c16514470ba0c3da
Now the Nalu data pointer points to the start of the NALU header
rather than pointing to the start code. Added a new method on
NaluReader to check whether the stream starts with a start code.
Change-Id: Ifaecbe0c911aa5cffdf0a966028e6cada8621cc3
For non-video slices, the data is not encrypted. This also skips the
frame headers for H.264; support for H.265 will be added later.
Issue #40
Change-Id: Id0cb0fb9ddb6adedf63ef4aef6b3a26260a21654
Removed the code for NALU splitting in the H.264 parser and moved
it to its own class. Also added support for length-prefixed
NALU splitting for use with the encrypting fragmenter.
Change-Id: I1e91266681f1b117fb2382cf80590651efc06619
Parse channel layout value from dec3 box. Pass it through audio stream
info. MPD builder forms audio channel configuration to signal ec-3
codec.
Specs: 1) ETSI TS 102 366 V1.3.1 Digital Audio Compression (AC-3,
Enhanced AC-3) Standard E.1.3.1.8.
2) DASH-IF Interoperability Points v3.0 9.2.1.2.
Issue #64
Change-Id: Ia2c22dd3d82e757ba5a88ba1de35c5d593f5005e
Before this change, the media file will fail to be parsed if it contains
non-wvtt text streams. This change allows demuxing of video and audio
streams in these media files even though the text stream is ignored.
Fixes#74.
Change-Id: I7ef108a51125c4965fe48c39efe9638f3a0e4759
This also changes the way frames are written in the WebM muxer. Now,
frames are stored and written on the next call to AddSample. So each
call to AddSample will write the previous frame. This is needed to
determine whether the given frame is the last one in the cluster.
Closes#70
Change-Id: Ic69ebad3c4729cdaa2017c9c7f497048501ac907
When generating ninja files we end up with two libwebm targets.
packager/media/formats/webm/webm.gyp:webm -> becomes target libwebm
packager/third_party/libwebm/libwebm.gyp:libwebm -> becomes target libwebm
Solve this conflict by renaming libwebm.gyp:libwebm to mkvmuxer.
There is a target name conflict between packager/base/base.gyp:run_all_unittests and
media_test.gyp:run_all_unittests. Change to media_test.gyp:run_tests_with_atexit_manager to
resolve the conflict.
On Linux the generated ninja files use path/libbase.a as target name.
In the Mac ninja file the target is just libbase.a.
As we have two libbase.a (base/base.gyp and media/base/media_base.gyp) the linking stage fails to include both libs.
Solve by renaming media_base.gyp's base target to media_base
For WebM contents, it is possible that we may receive some NewSampleEvent
before receiving ParserInitEvent. This is because init event is fired
after analyzing a video block which could come after an audio block.
Also modified Flush() function to return a bool to indicate whether the
the flush is successful and whether the samples are handled correctly.
And added macro to ensure Flush() and Parse() results are handled.
Fixes#71
Change-Id: I2294d6f529f54e4578344916559bb1bc116c745a
- Also refactor decryptor management code out of mp4_media_parser.cc
- Move decryptor managment logic to DecryptorSource class to make it
available for webm as well
- Remove data_offset member from DecryptConfig which is not useful
- Add widevine_pssh_data.proto file
Closes#72
Change-Id: I1d32baf4013ebd3382b5372c7433fae5033a260e
- dts was not set earlier, although for WebM, we could assume that
dts is the same as pts.
- Calculate block duration with the difference with the next block
if duration is not encoded, even if track default_duration is set.
- Use track default_duration as a duration estimate for the last
block.
- This also removes opus duration computation from encoded data.
Issues #67, #68
Change-Id: Icaa2769dcb2a89269ae014f44ad6a9262770aed2
- Box definitions for box type DEC3.
- Parser/muxer changes to support Enhanced-AC3 audio codecs.
- MPD signaling will come in Part 3.
Issue #64
Change-Id: Ifcd5efa1f61b470ec225127925631e4329853259
This does not support key-rotation and will give an error. This is
because WebM does not have a way to indicate a change in key ID using
media segments.
b/22463551
Change-Id: I9b3dac818dc370302a5afc0d25d8a060b64d30cd
Added packager tests for WebM audio. Also now only outputs the
language if it's not empty. Fixed the packager tests for that.
b/26540606
Change-Id: Ica804bd710055bcaa2113f948d723dedd78ef909
- Box definitions for box type DAC3.
- Parser/muxer changes to support AC3 audio codecs.
- EC3 audio sample entry will come in Part 2.
- MPD signaling will come in Part 3.
Issue #64
Change-Id: I790b46ae8179b933bb8f7da9cdd38591fe8da43d
ThreadedIoFile spawns a new thread for every new file. Thread
information is stored for tracking purpose by base::tracked_objects.
The tracking object remains even if the thread itself is destroyed.
This results in memory usage increased by a couple of bytes for every
new segment created in live mode (new segments spawns new threads).
Use WorkerPool instead to avoid spawning new threads.
Fixes Issue #61.
Change-Id: Id93283903c3ba8ebf172a0d58e19b082a72c6cf0
For mp4 outputs, a metadata box with version information is added to
moov box.
For mpd outputs, a text comment with version information is added in
the beginning of mpd file.
Issue #60
Change-Id: I783ba370781c0a8f77c910ff1172bad2e7edff75
- Another minor change in segmenter_test_base: scoped_refptr can
be passed by value, remove ".Pass".
Change-Id: I31f0cf74c5ad0aba8890d3b1845155d63d7326a0
* Changed Segmenters to accept StreamInfo rather than MediaStream
to help in testing.
* Changed MemoryFile behavior to mirror local file:
* Read non-existent file is an error.
* Write deletes any existing file.
* Fixed a bug in SingleSegmentSegmenter.
Change-Id: I339e35597ca4661b7a26c6fdbbfa2f9f511c7da0
Javascript/JSON does not support int64_t or unsigned numbers. asset_id,
if greater than 0x80000000 will be converted to negative number. Use
double to represent asset_id instead as 32-bit integer can be lossless
represented using double.
Bug: 26309000
Change-Id: I3e800c396a1231375776295154fb0d96156e980b
This can be used for unit tests to reduce the need for temporary
files. A MemoryFile acts the same as any other File object, but
stores the contents in memory. The memory pointer can be accessed
directly. A file with the 'memory://' prefix will be a memory file.
Change-Id: I10ae3ed5391c8fd838e6dfb33106dec959bdc224