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:
Kongqun Yang 2016-07-01 14:49:46 -07:00
parent f3d35b730c
commit cf778f7149
8 changed files with 37 additions and 24 deletions

View File

@ -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

View File

@ -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/"

View File

@ -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: "

View File

@ -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;
} }

View File

@ -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));
} }

View File

@ -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;
} }

View File

@ -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.

View 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());