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

Unified Diff: media/formats/webm/cluster_builder.cc

Issue 238273002: Adds WebMClusterParserTest coverage for duration default/estimation/fallback logic (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: cast to int to compare enum values in COMPILE_ASSERTs Created 6 years, 8 months 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/formats/webm/cluster_builder.h ('k') | media/formats/webm/webm_cluster_parser.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/formats/webm/cluster_builder.cc
diff --git a/media/formats/webm/cluster_builder.cc b/media/formats/webm/cluster_builder.cc
index ec95616f24ed87b50b551b05ae09ac2d354129a5..bada9e2f79c7406974d276a9066dcae71d088b65 100644
--- a/media/formats/webm/cluster_builder.cc
+++ b/media/formats/webm/cluster_builder.cc
@@ -32,6 +32,13 @@ static const uint8 kBlockGroupHeader[] = {
0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block(size = 0)
};
+static const uint8 kBlockGroupHeaderWithoutBlockDuration[] = {
+ 0xA0, // BlockGroup ID
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // BlockGroup(size = 0)
+ 0xA1, // Block ID
+ 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Block(size = 0)
+};
+
enum {
kClusterSizeOffset = 4,
kClusterTimecodeOffset = 14,
@@ -39,6 +46,7 @@ enum {
kSimpleBlockSizeOffset = 1,
kBlockGroupSizeOffset = 1,
+ kBlockGroupWithoutBlockDurationBlockSizeOffset = 10,
kBlockGroupDurationOffset = 11,
kBlockGroupBlockSizeOffset = 20,
@@ -85,8 +93,30 @@ void ClusterBuilder::AddSimpleBlock(int track_num, int64 timecode, int flags,
void ClusterBuilder::AddBlockGroup(int track_num, int64 timecode, int duration,
int flags, const uint8* data, int size) {
+ AddBlockGroupInternal(track_num, timecode, true, duration, flags, data, size);
+}
+
+void ClusterBuilder::AddBlockGroupWithoutBlockDuration(int track_num,
+ int64 timecode,
+ int flags,
+ const uint8* data,
+ int size) {
+ AddBlockGroupInternal(track_num, timecode, false, 0, flags, data, size);
+}
+
+
+void ClusterBuilder::AddBlockGroupInternal(int track_num, int64 timecode,
+ bool include_block_duration,
+ int duration, int flags,
+ const uint8* data, int size) {
int block_size = size + 4;
- int bytes_needed = sizeof(kBlockGroupHeader) + block_size;
+ int bytes_needed = block_size;
+ if (include_block_duration) {
+ bytes_needed += sizeof(kBlockGroupHeader);
+ } else {
+ bytes_needed += sizeof(kBlockGroupHeaderWithoutBlockDuration);
+ }
+
int block_group_size = bytes_needed - 9;
if (bytes_needed > (buffer_size_ - bytes_used_))
@@ -94,11 +124,21 @@ void ClusterBuilder::AddBlockGroup(int track_num, int64 timecode, int duration,
uint8* buf = buffer_.get() + bytes_used_;
int block_group_offset = bytes_used_;
- memcpy(buf, kBlockGroupHeader, sizeof(kBlockGroupHeader));
+ if (include_block_duration) {
+ memcpy(buf, kBlockGroupHeader, sizeof(kBlockGroupHeader));
+ UpdateUInt64(block_group_offset + kBlockGroupDurationOffset, duration);
+ UpdateUInt64(block_group_offset + kBlockGroupBlockSizeOffset, block_size);
+ buf += sizeof(kBlockGroupHeader);
+ } else {
+ memcpy(buf, kBlockGroupHeaderWithoutBlockDuration,
+ sizeof(kBlockGroupHeaderWithoutBlockDuration));
+ UpdateUInt64(
+ block_group_offset + kBlockGroupWithoutBlockDurationBlockSizeOffset,
+ block_size);
+ buf += sizeof(kBlockGroupHeaderWithoutBlockDuration);
+ }
+
UpdateUInt64(block_group_offset + kBlockGroupSizeOffset, block_group_size);
- UpdateUInt64(block_group_offset + kBlockGroupDurationOffset, duration);
- UpdateUInt64(block_group_offset + kBlockGroupBlockSizeOffset, block_size);
- buf += sizeof(kBlockGroupHeader);
// Make sure the 4 most-significant bits are 0.
// http://www.matroska.org/technical/specs/index.html#block_structure
« no previous file with comments | « media/formats/webm/cluster_builder.h ('k') | media/formats/webm/webm_cluster_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698