Update CHANGELOG for v1.5.0
- Also updated a few wording in README and in the code. Change-Id: I9adf297c00aee92e61e87effa3bdcfaf402638e5
This commit is contained in:
parent
f3d35b730c
commit
cf778f7149
13
CHANGELOG.md
13
CHANGELOG.md
|
@ -1,3 +1,15 @@
|
||||||
|
## [1.5.0] - 2016-07-12
|
||||||
|
### Added
|
||||||
|
- Added TS (output) and HLS (output) with SAMPLE-AES encryption support.
|
||||||
|
Note that only H.264 and AAC are supported right now.
|
||||||
|
- Added support for CENCv3, i.e. 'cbcs', 'cbc1', 'cens' protection schemes.
|
||||||
|
- Added H.265 support in TS (input) and iso-bmff (input / output).
|
||||||
|
- Added experimental Opus in iso-bmff support.
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
- Change project name from edash-packager to shaka-packager. Also replaces
|
||||||
|
various references of edash in the code accordingly.
|
||||||
|
|
||||||
## [1.4.1] - 2016-06-23
|
## [1.4.1] - 2016-06-23
|
||||||
### Fixed
|
### Fixed
|
||||||
- [VP9] VPCodecConfiguration box should inherit from FullBox instead of Box.
|
- [VP9] VPCodecConfiguration box should inherit from FullBox instead of Box.
|
||||||
|
@ -161,6 +173,7 @@ First public release.
|
||||||
- Added mpd_generator driver program to generate mpd file from packager generated
|
- Added mpd_generator driver program to generate mpd file from packager generated
|
||||||
intermediate files.
|
intermediate files.
|
||||||
|
|
||||||
|
[1.5.0]: https://github.com/google/shaka-packager/compare/v1.4.0...v1.5.0
|
||||||
[1.4.1]: https://github.com/google/shaka-packager/compare/v1.4.0...v1.4.1
|
[1.4.1]: https://github.com/google/shaka-packager/compare/v1.4.0...v1.4.1
|
||||||
[1.4.0]: https://github.com/google/shaka-packager/compare/v1.3.1...v1.4.0
|
[1.4.0]: https://github.com/google/shaka-packager/compare/v1.3.1...v1.4.0
|
||||||
[1.3.1]: https://github.com/google/shaka-packager/compare/v1.3.0...v1.3.1
|
[1.3.1]: https://github.com/google/shaka-packager/compare/v1.3.0...v1.3.1
|
||||||
|
|
24
README.md
24
README.md
|
@ -1,10 +1,10 @@
|
||||||
![Shaka Packager](docs/shaka-packager.png)
|
# ![Shaka Packager](docs/shaka-packager.png)
|
||||||
|
|
||||||
[![Build Status](https://travis-ci.org/google/shaka-packager.svg?branch=master)](https://travis-ci.org/google/shaka-packager)
|
[![Build Status](https://travis-ci.org/google/shaka-packager.svg?branch=master)](https://travis-ci.org/google/shaka-packager)
|
||||||
|
|
||||||
Media packaging SDK intended for C++ programmers writing DASH packager applications with common encryption support, Widevine DRM support, Live, and Video-On-Demand.
|
Media packaging SDK intended for C++ programmers writing DASH/HLS packager applications with common encryption support, Widevine DRM support, Live, and Video-On-Demand.
|
||||||
|
|
||||||
This document provides the information needed to create a DASH packager that is able to remux and encrypt a video into fragmented ISO BMFF format with common encryption (CENC) support. The DASH packaging API is also designed in such a way for easy extension to more source and destination formats.
|
This document provides the information needed to create a DASH/HLS packager that is able to remux and encrypt a video into fragmented ISO BMFF format with common encryption (CENC) support. The DASH/HLS packaging API is also designed in such a way for easy extension to more source and destination formats.
|
||||||
|
|
||||||
Current supported codecs:
|
Current supported codecs:
|
||||||
|
|
||||||
|
@ -12,15 +12,15 @@ Current supported codecs:
|
||||||
|:-----------------:|:------------:|:------------:|:------------:|:-----------:|
|
|:-----------------:|:------------:|:------------:|:------------:|:-----------:|
|
||||||
| H264 (AVC) | I / O | - | I / O | I |
|
| H264 (AVC) | I / O | - | I / O | I |
|
||||||
| H265 (HEVC) | I / O | - | I | - |
|
| H265 (HEVC) | I / O | - | I | - |
|
||||||
| VP8 | I / O | I / O | - | - |
|
| VP8 | *I / O* | I / O | - | - |
|
||||||
| VP9 | I / O | I / O | - | - |
|
| VP9 | *I / O* | I / O | - | - |
|
||||||
| AAC | I / O | - | I / O | I |
|
| AAC | I / O | - | I / O | I |
|
||||||
| Dolby AC3/EAC3 | I / O | - | - | - |
|
| Dolby AC3/EAC3 | I / O | - | - | - |
|
||||||
| DTS | I / O | - | - | - |
|
| DTS | I / O | - | - | - |
|
||||||
| Opus | - | I / O | - | - |
|
| Opus | *I / O* | I / O | - | - |
|
||||||
| Vorbis | - | I / O | - | - |
|
| Vorbis | - | I / O | - | - |
|
||||||
** I for input and O for output.
|
** I for input and O for output.
|
||||||
** We will update this table once new formats are supported.
|
** VP8/VP9/Opus support in ISO-BMFF is experimental.
|
||||||
|
|
||||||
Right now this project is supported directly on Linux and MacOSX platforms only. One option to run shaka-packager on other platforms is using [docker] (#Using docker for testing /development).
|
Right now this project is supported directly on Linux and MacOSX platforms only. One option to run shaka-packager on other platforms is using [docker] (#Using docker for testing /development).
|
||||||
|
|
||||||
|
@ -268,16 +268,16 @@ mpd_generator \
|
||||||
Output MPEG2-TS video.
|
Output MPEG2-TS video.
|
||||||
```Shell
|
```Shell
|
||||||
packager \
|
packager \
|
||||||
'input=bear-1280x720.mp4,stream=video,segment_template=bear$Number$.ts,output_format=ts'
|
'input=bear-1280x720.mp4,stream=video,segment_template=bear$Number$.ts'
|
||||||
```
|
```
|
||||||
|
|
||||||
Output HLS playlists with MPEG2-TS video. The following outputs a Master
|
Output HLS playlists with MPEG2-TS video. The following outputs a Master
|
||||||
Playlist as `master.m3u8`. And the Media Playlist for the video as
|
Playlist as `master.m3u8`. And the Media Playlist for the video as
|
||||||
`playlist.m3u8`. `--hls_base_url` specifies the prefix for the
|
`playlist.m3u8`. The optional `--hls_base_url` specifies the prefix for the
|
||||||
generated TS segments.
|
generated TS segments.
|
||||||
```Shell
|
```Shell
|
||||||
packager \
|
packager \
|
||||||
'input=bear-1280x720.mp4,stream=video,segment_template=bear$Number$.ts,output_format=ts,playlist_name=playlist.m3u8' \
|
'input=bear-1280x720.mp4,stream=video,segment_template=bear$Number$.ts,playlist_name=playlist.m3u8' \
|
||||||
--single_segment=false \
|
--single_segment=false \
|
||||||
--hls_master_playlist_output="master.m3u8" \
|
--hls_master_playlist_output="master.m3u8" \
|
||||||
--hls_base_url="http://localhost:10000/"
|
--hls_base_url="http://localhost:10000/"
|
||||||
|
@ -287,8 +287,8 @@ For audio Media Playlists, the name and group for EXT-X-MEDIA tag must be
|
||||||
specified.
|
specified.
|
||||||
```Shell
|
```Shell
|
||||||
packager \
|
packager \
|
||||||
'input=input.mp4,stream=video,output_format=ts,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
|
'input=input.mp4,stream=video,segment_template=output$Number$.ts,playlist_name=video_playlist.m3u8' \
|
||||||
'input=input.mp4,stream=audio,output_format=ts,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
|
'input=input.mp4,stream=audio,segment_template=output_audio$Number$.ts,playlist_name=audio_playlist.m3u8,hls_group_id=audio,hls_name=ENGLISH' \
|
||||||
--single_segment=false \
|
--single_segment=false \
|
||||||
--hls_master_playlist_output="master_playlist.m3u8" \
|
--hls_master_playlist_output="master_playlist.m3u8" \
|
||||||
--hls_base_url="http://localhost:10000/"
|
--hls_base_url="http://localhost:10000/"
|
||||||
|
|
|
@ -193,8 +193,8 @@ void WritePmtToBuffer(const uint8_t* pmt,
|
||||||
void WritePrivateDataIndicatorDescriptor(FourCC fourcc, BufferWriter* output) {
|
void WritePrivateDataIndicatorDescriptor(FourCC fourcc, BufferWriter* output) {
|
||||||
const uint8_t kPrivateDataIndicatorDescriptor = 15;
|
const uint8_t kPrivateDataIndicatorDescriptor = 15;
|
||||||
output->AppendInt(kPrivateDataIndicatorDescriptor);
|
output->AppendInt(kPrivateDataIndicatorDescriptor);
|
||||||
output->AppendInt(static_cast<uint8_t>(sizeof(FOURCC_aacd)));
|
output->AppendInt(static_cast<uint8_t>(sizeof(fourcc)));
|
||||||
output->AppendInt(FOURCC_aacd);
|
output->AppendInt(fourcc);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool WriteAacAudioSetupInformation(const uint8_t* aac_audio_specific_config,
|
bool WriteAacAudioSetupInformation(const uint8_t* aac_audio_specific_config,
|
||||||
|
@ -376,7 +376,7 @@ bool AacProgramMapTableWriter::EncryptedSegmentPmtWithParameters(
|
||||||
int current_next_indicator,
|
int current_next_indicator,
|
||||||
BufferWriter* writer) {
|
BufferWriter* writer) {
|
||||||
// -12 because there are 12 bytes between 'descriptor_length' in
|
// -12 because there are 12 bytes between 'descriptor_length' in
|
||||||
// registartion_descriptor and 'setup_data_length' in audio_setup_information.
|
// registration_descriptor and 'setup_data_length' in audio_setup_information.
|
||||||
if (aac_audio_specific_config_.size() >
|
if (aac_audio_specific_config_.size() >
|
||||||
std::numeric_limits<uint8_t>::max() - 12) {
|
std::numeric_limits<uint8_t>::max() - 12) {
|
||||||
LOG(ERROR) << "AACAudioSpecificConfig of size: "
|
LOG(ERROR) << "AACAudioSpecificConfig of size: "
|
||||||
|
|
|
@ -189,7 +189,7 @@ Status TsSegmenter::NotifyEncrypted() {
|
||||||
|
|
||||||
if (!pes_packet_generator_->SetEncryptionKey(encryption_key_.Pass()))
|
if (!pes_packet_generator_->SetEncryptionKey(encryption_key_.Pass()))
|
||||||
return Status(error::INTERNAL_ERROR, "Failed to set encryption key.");
|
return Status(error::INTERNAL_ERROR, "Failed to set encryption key.");
|
||||||
ts_writer_->SignalEncypted();
|
ts_writer_->SignalEncrypted();
|
||||||
}
|
}
|
||||||
return Status::OK;
|
return Status::OK;
|
||||||
}
|
}
|
||||||
|
|
|
@ -75,7 +75,7 @@ class MockTsWriter : public TsWriter {
|
||||||
public:
|
public:
|
||||||
MOCK_METHOD1(Initialize, bool(const StreamInfo& stream_info));
|
MOCK_METHOD1(Initialize, bool(const StreamInfo& stream_info));
|
||||||
MOCK_METHOD1(NewSegment, bool(const std::string& file_name));
|
MOCK_METHOD1(NewSegment, bool(const std::string& file_name));
|
||||||
MOCK_METHOD0(SignalEncypted, void());
|
MOCK_METHOD0(SignalEncrypted, void());
|
||||||
MOCK_METHOD0(FinalizeSegment, bool());
|
MOCK_METHOD0(FinalizeSegment, bool());
|
||||||
|
|
||||||
// Similar to the hack above but takes a scoped_ptr.
|
// Similar to the hack above but takes a scoped_ptr.
|
||||||
|
@ -457,7 +457,7 @@ TEST_F(TsSegmenterTest, WithEncryptionNoClearLead) {
|
||||||
TsSegmenter segmenter(options, &mock_listener);
|
TsSegmenter segmenter(options, &mock_listener);
|
||||||
|
|
||||||
EXPECT_CALL(*mock_ts_writer_, Initialize(_)).WillOnce(Return(true));
|
EXPECT_CALL(*mock_ts_writer_, Initialize(_)).WillOnce(Return(true));
|
||||||
EXPECT_CALL(*mock_ts_writer_, SignalEncypted());
|
EXPECT_CALL(*mock_ts_writer_, SignalEncrypted());
|
||||||
EXPECT_CALL(*mock_pes_packet_generator_, Initialize(_))
|
EXPECT_CALL(*mock_pes_packet_generator_, Initialize(_))
|
||||||
.WillOnce(Return(true));
|
.WillOnce(Return(true));
|
||||||
|
|
||||||
|
@ -495,7 +495,7 @@ TEST_F(TsSegmenterTest, WithEncryptionNoClearLeadNoMuxerListener) {
|
||||||
TsSegmenter segmenter(options, nullptr);
|
TsSegmenter segmenter(options, nullptr);
|
||||||
|
|
||||||
EXPECT_CALL(*mock_ts_writer_, Initialize(_)).WillOnce(Return(true));
|
EXPECT_CALL(*mock_ts_writer_, Initialize(_)).WillOnce(Return(true));
|
||||||
EXPECT_CALL(*mock_ts_writer_, SignalEncypted());
|
EXPECT_CALL(*mock_ts_writer_, SignalEncrypted());
|
||||||
EXPECT_CALL(*mock_pes_packet_generator_, Initialize(_))
|
EXPECT_CALL(*mock_pes_packet_generator_, Initialize(_))
|
||||||
.WillOnce(Return(true));
|
.WillOnce(Return(true));
|
||||||
|
|
||||||
|
@ -616,7 +616,7 @@ TEST_F(TsSegmenterTest, WithEncryptionWithClearLead) {
|
||||||
EXPECT_CALL(mock_listener, OnEncryptionStart());
|
EXPECT_CALL(mock_listener, OnEncryptionStart());
|
||||||
EXPECT_CALL(*mock_pes_packet_generator_raw, SetEncryptionKeyMock(_))
|
EXPECT_CALL(*mock_pes_packet_generator_raw, SetEncryptionKeyMock(_))
|
||||||
.WillOnce(Return(true));
|
.WillOnce(Return(true));
|
||||||
EXPECT_CALL(*mock_ts_writer_raw, SignalEncypted());
|
EXPECT_CALL(*mock_ts_writer_raw, SignalEncrypted());
|
||||||
EXPECT_OK(segmenter.AddSample(sample2));
|
EXPECT_OK(segmenter.AddSample(sample2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -227,7 +227,7 @@ bool TsWriter::NewSegment(const std::string& file_name) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TsWriter::SignalEncypted() {
|
void TsWriter::SignalEncrypted() {
|
||||||
encrypted_ = true;
|
encrypted_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -42,7 +42,7 @@ class TsWriter {
|
||||||
virtual bool NewSegment(const std::string& file_name);
|
virtual bool NewSegment(const std::string& file_name);
|
||||||
|
|
||||||
/// Signals the writer that the rest of the segments are encrypted.
|
/// Signals the writer that the rest of the segments are encrypted.
|
||||||
virtual void SignalEncypted();
|
virtual void SignalEncrypted();
|
||||||
|
|
||||||
/// Flush all the pending PesPackets that have not been written to file and
|
/// Flush all the pending PesPackets that have not been written to file and
|
||||||
/// close the file.
|
/// close the file.
|
||||||
|
|
|
@ -319,7 +319,7 @@ TEST_F(TsWriterTest, EncryptedSegmentsH264Pmt) {
|
||||||
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
||||||
|
|
||||||
// Overwrite the file but as encrypted segment.
|
// Overwrite the file but as encrypted segment.
|
||||||
ts_writer_.SignalEncypted();
|
ts_writer_.SignalEncrypted();
|
||||||
EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_));
|
EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_));
|
||||||
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
||||||
|
|
||||||
|
@ -381,7 +381,7 @@ TEST_F(TsWriterTest, EncryptedSegmentsAacPmt) {
|
||||||
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
||||||
|
|
||||||
// Overwrite the file but as encrypted segment.
|
// Overwrite the file but as encrypted segment.
|
||||||
ts_writer_.SignalEncypted();
|
ts_writer_.SignalEncrypted();
|
||||||
EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_));
|
EXPECT_TRUE(ts_writer_.NewSegment(test_file_name_));
|
||||||
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
EXPECT_TRUE(ts_writer_.FinalizeSegment());
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue