| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "media/formats/mp4/avc.h" | 5 #include "media/formats/mp4/avc.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 temp.begin() + pos + nal_size); | 69 temp.begin() + pos + nal_size); |
| 70 pos += nal_size; | 70 pos += nal_size; |
| 71 } | 71 } |
| 72 return pos == temp.size(); | 72 return pos == temp.size(); |
| 73 } | 73 } |
| 74 | 74 |
| 75 // static | 75 // static |
| 76 bool AVC::InsertParamSetsAnnexB(const AVCDecoderConfigurationRecord& avc_config, | 76 bool AVC::InsertParamSetsAnnexB(const AVCDecoderConfigurationRecord& avc_config, |
| 77 std::vector<uint8>* buffer, | 77 std::vector<uint8>* buffer, |
| 78 std::vector<SubsampleEntry>* subsamples) { | 78 std::vector<SubsampleEntry>* subsamples) { |
| 79 DCHECK(AVC::IsValidAnnexB(*buffer)); | 79 DCHECK(AVC::IsValidAnnexB(*buffer, *subsamples)); |
| 80 | 80 |
| 81 scoped_ptr<H264Parser> parser(new H264Parser()); | 81 scoped_ptr<H264Parser> parser(new H264Parser()); |
| 82 const uint8* start = &(*buffer)[0]; | 82 const uint8* start = &(*buffer)[0]; |
| 83 parser->SetStream(start, buffer->size()); | 83 parser->SetEncryptedStream(start, buffer->size(), *subsamples); |
| 84 | 84 |
| 85 H264NALU nalu; | 85 H264NALU nalu; |
| 86 if (parser->AdvanceToNextNALU(&nalu) != H264Parser::kOk) | 86 if (parser->AdvanceToNextNALU(&nalu) != H264Parser::kOk) |
| 87 return false; | 87 return false; |
| 88 | 88 |
| 89 std::vector<uint8>::iterator config_insert_point = buffer->begin(); | 89 std::vector<uint8>::iterator config_insert_point = buffer->begin(); |
| 90 std::vector<SubsampleEntry>::iterator subsamples_insert_point = | 90 std::vector<SubsampleEntry>::iterator subsamples_insert_point = |
| 91 subsamples->begin(); | 91 subsamples->begin(); |
| 92 | 92 |
| 93 if (nalu.nal_unit_type == H264NALU::kAUD) { | 93 if (nalu.nal_unit_type == H264NALU::kAUD) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 119 | 119 |
| 120 if (!subsamples->empty()) { | 120 if (!subsamples->empty()) { |
| 121 subsamples->insert(subsamples_insert_point, | 121 subsamples->insert(subsamples_insert_point, |
| 122 config_subsamples.begin(), | 122 config_subsamples.begin(), |
| 123 config_subsamples.end()); | 123 config_subsamples.end()); |
| 124 } | 124 } |
| 125 | 125 |
| 126 buffer->insert(config_insert_point, | 126 buffer->insert(config_insert_point, |
| 127 param_sets.begin(), param_sets.end()); | 127 param_sets.begin(), param_sets.end()); |
| 128 | 128 |
| 129 DCHECK(AVC::IsValidAnnexB(*buffer)); | 129 DCHECK(AVC::IsValidAnnexB(*buffer, *subsamples)); |
| 130 return true; | 130 return true; |
| 131 } | 131 } |
| 132 | 132 |
| 133 // static | 133 // static |
| 134 bool AVC::ConvertConfigToAnnexB( | 134 bool AVC::ConvertConfigToAnnexB( |
| 135 const AVCDecoderConfigurationRecord& avc_config, | 135 const AVCDecoderConfigurationRecord& avc_config, |
| 136 std::vector<uint8>* buffer, | 136 std::vector<uint8>* buffer, |
| 137 std::vector<SubsampleEntry>* subsamples) { | 137 std::vector<SubsampleEntry>* subsamples) { |
| 138 DCHECK(buffer->empty()); | 138 DCHECK(buffer->empty()); |
| 139 buffer->clear(); | 139 buffer->clear(); |
| (...skipping 24 matching lines...) Expand all Loading... |
| 164 | 164 |
| 165 SubsampleEntry entry; | 165 SubsampleEntry entry; |
| 166 entry.clear_bytes = kAnnexBStartCodeSize + avc_config.pps_list[i].size(); | 166 entry.clear_bytes = kAnnexBStartCodeSize + avc_config.pps_list[i].size(); |
| 167 entry.cypher_bytes = 0; | 167 entry.cypher_bytes = 0; |
| 168 subsamples->push_back(entry); | 168 subsamples->push_back(entry); |
| 169 } | 169 } |
| 170 return true; | 170 return true; |
| 171 } | 171 } |
| 172 | 172 |
| 173 // Verifies AnnexB NALU order according to ISO/IEC 14496-10 Section 7.4.1.2.3 | 173 // Verifies AnnexB NALU order according to ISO/IEC 14496-10 Section 7.4.1.2.3 |
| 174 bool AVC::IsValidAnnexB(const std::vector<uint8>& buffer) { | 174 bool AVC::IsValidAnnexB(const std::vector<uint8>& buffer, |
| 175 return IsValidAnnexB(&buffer[0], buffer.size()); | 175 const std::vector<SubsampleEntry>& subsamples) { |
| 176 return IsValidAnnexB(&buffer[0], buffer.size(), subsamples); |
| 176 } | 177 } |
| 177 | 178 |
| 178 bool AVC::IsValidAnnexB(const uint8* buffer, size_t size) { | 179 bool AVC::IsValidAnnexB(const uint8* buffer, size_t size, |
| 180 const std::vector<SubsampleEntry>& subsamples) { |
| 179 DVLOG(1) << __FUNCTION__; | 181 DVLOG(1) << __FUNCTION__; |
| 180 DCHECK(buffer); | 182 DCHECK(buffer); |
| 181 | 183 |
| 182 if (size == 0) | 184 if (size == 0) |
| 183 return true; | 185 return true; |
| 184 | 186 |
| 185 H264Parser parser; | 187 H264Parser parser; |
| 186 parser.SetStream(buffer, size); | 188 parser.SetEncryptedStream(buffer, size, subsamples); |
| 187 | 189 |
| 188 typedef enum { | 190 typedef enum { |
| 189 kAUDAllowed, | 191 kAUDAllowed, |
| 190 kBeforeFirstVCL, // VCL == nal_unit_types 1-5 | 192 kBeforeFirstVCL, // VCL == nal_unit_types 1-5 |
| 191 kAfterFirstVCL, | 193 kAfterFirstVCL, |
| 192 kEOStreamAllowed, | 194 kEOStreamAllowed, |
| 193 kNoMoreDataAllowed, | 195 kNoMoreDataAllowed, |
| 194 } NALUOrderState; | 196 } NALUOrderState; |
| 195 | 197 |
| 196 H264NALU nalu; | 198 H264NALU nalu; |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 298 NOTREACHED() << "AdvanceToNextNALU() returned kUnsupportedStream!"; | 300 NOTREACHED() << "AdvanceToNextNALU() returned kUnsupportedStream!"; |
| 299 return false; | 301 return false; |
| 300 | 302 |
| 301 case H264Parser::kEOStream: | 303 case H264Parser::kEOStream: |
| 302 done = true; | 304 done = true; |
| 303 } | 305 } |
| 304 } | 306 } |
| 305 | 307 |
| 306 return order_state >= kAfterFirstVCL; | 308 return order_state >= kAfterFirstVCL; |
| 307 } | 309 } |
| 308 | |
| 309 } // namespace mp4 | 310 } // namespace mp4 |
| 310 } // namespace media | 311 } // namespace media |
| OLD | NEW |