Index: content/common/gpu/media/avc_config_record_builder.cc |
diff --git a/content/common/gpu/media/avc_config_record_builder.cc b/content/common/gpu/media/avc_config_record_builder.cc |
deleted file mode 100644 |
index df0abe718bdb8d3e7ca410681e1770887d04d158..0000000000000000000000000000000000000000 |
--- a/content/common/gpu/media/avc_config_record_builder.cc |
+++ /dev/null |
@@ -1,155 +0,0 @@ |
-// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
-// Use of this source code is governed by a BSD-style license that can be |
-// found in the LICENSE file. |
- |
-#include "content/common/gpu/media/avc_config_record_builder.h" |
- |
-#include <limits> |
- |
-#include "base/logging.h" |
-#include "content/common/gpu/media/h264_parser.h" |
- |
-namespace content { |
- |
-AVCConfigRecordBuilder::AVCConfigRecordBuilder() |
- : sps_profile_idc_(0), |
- sps_constraint_setx_flag_(0), |
- sps_level_idc_(0), |
- coded_width_(0), |
- coded_height_(0) { |
-} |
- |
-AVCConfigRecordBuilder::~AVCConfigRecordBuilder() { |
-} |
- |
-bool AVCConfigRecordBuilder::ProcessNALU( |
- H264Parser* parser, |
- const H264NALU& nalu, |
- std::vector<uint8>* config_record) { |
- if (nalu.nal_unit_type == H264NALU::kSPS) { |
- return ProcessSPS(parser, nalu); |
- } else if (nalu.nal_unit_type == H264NALU::kPPS) { |
- return ProcessPPS(parser, nalu); |
- } else if (nalu.nal_unit_type >= 1 && nalu.nal_unit_type <= 5) { |
- // Ready to build the AVC decoder configuration record once the first slice |
- // type is encountered. |
- return BuildConfigRecord(config_record); |
- } |
- // Effectively skip this NALU by returning success. |
- return true; |
-} |
- |
-bool AVCConfigRecordBuilder::BuildConfigRecord( |
- std::vector<uint8>* config_record) { |
- // 5 bytes for AVC record header. 1 byte for the number of SPS units. |
- // 1 byte for the number of PPS units. |
- size_t record_size = 7; |
- for (NALUVector::const_iterator it = sps_nalus_.begin(); |
- it != sps_nalus_.end(); ++it) { |
- // Plus 2 bytes to store the SPS size. |
- size_t size = (*it)->size() + 2; |
- if (std::numeric_limits<size_t>::max() - size <= record_size) |
- return false; |
- record_size += size; |
- } |
- for (NALUVector::const_iterator it = pps_nalus_.begin(); |
- it != pps_nalus_.end(); ++it) { |
- // Plus 2 bytes to store the PPS size. |
- size_t size = (*it)->size() + 2; |
- if (std::numeric_limits<size_t>::max() - size <= record_size) |
- return false; |
- record_size += size; |
- } |
- std::vector<uint8> extra_data(record_size); |
- |
- // AVC decoder configuration record version. |
- extra_data[0] = 0x01; |
- // Profile. |
- extra_data[1] = sps_profile_idc_ & 0xff; |
- // Profile compatibility, must match the byte between profile IDC |
- // and level IDC in the SPS. |
- extra_data[2] = sps_constraint_setx_flag_; |
- // AVC level. |
- extra_data[3] = sps_level_idc_ & 0xff; |
- |
- // TODO(sail): There's no way to get the NALU length field size from the |
- // SPS and PPS data. Just assume 4 for now. |
- const size_t kNALULengthFieldSize = 4; |
- |
- // The first 6 bits are reserved and must be 1. Last two bits are the |
- // NALU field size minus 1. |
- extra_data[4] = 0xfc | ((kNALULengthFieldSize - 1) & 0x03); |
- |
- // The first 3 bits are reserved and must be 1. Last 5 bits are the |
- // number of SPS units. |
- extra_data[5] = 0xe0 | (sps_nalus_.size() & 0x1f); |
- size_t index = 6; |
- if (!sps_nalus_.empty()) |
- index += CopyNALUsToConfigRecord(sps_nalus_, &extra_data[index]); |
- |
- // The number of PPS units. |
- extra_data[index++] = pps_nalus_.size() & 0xff; |
- if (!pps_nalus_.empty()) |
- CopyNALUsToConfigRecord(pps_nalus_, &extra_data[index]); |
- |
- *config_record = extra_data; |
- return true; |
-} |
- |
-size_t AVCConfigRecordBuilder::CopyNALUsToConfigRecord(const NALUVector& nalus, |
- uint8* record_buffer) { |
- size_t index = 0; |
- for (NALUVector::const_iterator it = nalus.begin(); |
- it != nalus.end(); ++it) { |
- // High byte of the NALU size. |
- record_buffer[index++] = ((*it)->size() >> 8) & 0xff; |
- // Low byte of the NALU size. |
- record_buffer[index++] = (*it)->size() & 0xff; |
- // The NALU data. |
- memcpy(record_buffer + index, (*it)->front(), (*it)->size()); |
- index += (*it)->size(); |
- } |
- return index; |
-} |
- |
-bool AVCConfigRecordBuilder::ProcessSPS(H264Parser* parser, |
- const H264NALU& nalu) { |
- int sps_id = 0; |
- H264Parser::Result result = parser->ParseSPS(&sps_id); |
- if (result != H264Parser::kOk) |
- return false; |
- |
- std::vector<uint8> bytes(nalu.data, nalu.data + nalu.size); |
- sps_nalus_.push_back(base::RefCountedBytes::TakeVector(&bytes)); |
- |
- const H264SPS* sps = parser->GetSPS(sps_id); |
- |
- // Use the last width and height that are encountered. |
- coded_width_ = (sps->pic_width_in_mbs_minus1 + 1) * 16; |
- if (sps->frame_mbs_only_flag) |
- coded_height_ = (sps->pic_height_in_map_units_minus1 + 1) * 16; |
- else |
- coded_height_ = (sps->pic_height_in_map_units_minus1 + 1) * 32; |
- |
- // Use the last video profile and flags that are encountered. |
- sps_profile_idc_ = sps->profile_idc; |
- sps_constraint_setx_flag_ = sps->constraint_setx_flag; |
- // Use the largest AVC level that's encountered. |
- sps_level_idc_ = std::max(sps_level_idc_, sps->level_idc); |
- |
- return true; |
-} |
- |
-bool AVCConfigRecordBuilder::ProcessPPS(H264Parser* parser, |
- const H264NALU& nalu) { |
- int pps_id = 0; |
- H264Parser::Result result = parser->ParsePPS(&pps_id); |
- if (result != H264Parser::kOk) |
- return false; |
- |
- std::vector<uint8> bytes(nalu.data, nalu.data + nalu.size); |
- pps_nalus_.push_back(base::RefCountedBytes::TakeVector(&bytes)); |
- return true; |
-} |
- |
-} // namespace content |