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

Side by Side Diff: media/filters/h264_parser.cc

Issue 816353010: Implemented HEVC video demuxing and parsing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Moved back h265_parser_unittest.cc in media/BUILD.gn Created 5 years, 3 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 unified diff | Download patch
« no previous file with comments | « media/filters/h264_parser.h ('k') | media/filters/h265_parser.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 "base/logging.h" 5 #include "base/logging.h"
6 #include "base/memory/scoped_ptr.h" 6 #include "base/memory/scoped_ptr.h"
7 #include "base/stl_util.h" 7 #include "base/stl_util.h"
8 8
9 #include "media/base/decrypt_config.h" 9 #include "media/base/decrypt_config.h"
10 #include "media/filters/h264_parser.h" 10 #include "media/filters/h264_parser.h"
(...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after
206 *start_code_size = 0; 206 *start_code_size = 0;
207 return false; 207 return false;
208 } 208 }
209 209
210 bool H264Parser::LocateNALU(off_t* nalu_size, off_t* start_code_size) { 210 bool H264Parser::LocateNALU(off_t* nalu_size, off_t* start_code_size) {
211 // Find the start code of next NALU. 211 // Find the start code of next NALU.
212 off_t nalu_start_off = 0; 212 off_t nalu_start_off = 0;
213 off_t annexb_start_code_size = 0; 213 off_t annexb_start_code_size = 0;
214 214
215 if (!FindStartCodeInClearRanges(stream_, bytes_left_, 215 if (!FindStartCodeInClearRanges(stream_, bytes_left_,
216 encrypted_ranges_,
216 &nalu_start_off, &annexb_start_code_size)) { 217 &nalu_start_off, &annexb_start_code_size)) {
217 DVLOG(4) << "Could not find start code, end of stream?"; 218 DVLOG(4) << "Could not find start code, end of stream?";
218 return false; 219 return false;
219 } 220 }
220 221
221 // Move the stream to the beginning of the NALU (pointing at the start code). 222 // Move the stream to the beginning of the NALU (pointing at the start code).
222 stream_ += nalu_start_off; 223 stream_ += nalu_start_off;
223 bytes_left_ -= nalu_start_off; 224 bytes_left_ -= nalu_start_off;
224 225
225 const uint8* nalu_data = stream_ + annexb_start_code_size; 226 const uint8* nalu_data = stream_ + annexb_start_code_size;
226 off_t max_nalu_data_size = bytes_left_ - annexb_start_code_size; 227 off_t max_nalu_data_size = bytes_left_ - annexb_start_code_size;
227 if (max_nalu_data_size <= 0) { 228 if (max_nalu_data_size <= 0) {
228 DVLOG(3) << "End of stream"; 229 DVLOG(3) << "End of stream";
229 return false; 230 return false;
230 } 231 }
231 232
232 // Find the start code of next NALU; 233 // Find the start code of next NALU;
233 // if successful, |nalu_size_without_start_code| is the number of bytes from 234 // if successful, |nalu_size_without_start_code| is the number of bytes from
234 // after previous start code to before this one; 235 // after previous start code to before this one;
235 // if next start code is not found, it is still a valid NALU since there 236 // if next start code is not found, it is still a valid NALU since there
236 // are some bytes left after the first start code: all the remaining bytes 237 // are some bytes left after the first start code: all the remaining bytes
237 // belong to the current NALU. 238 // belong to the current NALU.
238 off_t next_start_code_size = 0; 239 off_t next_start_code_size = 0;
239 off_t nalu_size_without_start_code = 0; 240 off_t nalu_size_without_start_code = 0;
240 if (!FindStartCodeInClearRanges(nalu_data, max_nalu_data_size, 241 if (!FindStartCodeInClearRanges(nalu_data, max_nalu_data_size,
242 encrypted_ranges_,
241 &nalu_size_without_start_code, 243 &nalu_size_without_start_code,
242 &next_start_code_size)) { 244 &next_start_code_size)) {
243 nalu_size_without_start_code = max_nalu_data_size; 245 nalu_size_without_start_code = max_nalu_data_size;
244 } 246 }
245 *nalu_size = nalu_size_without_start_code + annexb_start_code_size; 247 *nalu_size = nalu_size_without_start_code + annexb_start_code_size;
246 *start_code_size = annexb_start_code_size; 248 *start_code_size = annexb_start_code_size;
247 return true; 249 return true;
248 } 250 }
249 251
250 bool H264Parser::FindStartCodeInClearRanges( 252 bool H264Parser::FindStartCodeInClearRanges(
251 const uint8* data, 253 const uint8* data,
252 off_t data_size, 254 off_t data_size,
255 const Ranges<const uint8*>& encrypted_ranges,
253 off_t* offset, 256 off_t* offset,
254 off_t* start_code_size) { 257 off_t* start_code_size) {
255 if (encrypted_ranges_.size() == 0) 258 if (encrypted_ranges.size() == 0)
256 return FindStartCode(data, data_size, offset, start_code_size); 259 return FindStartCode(data, data_size, offset, start_code_size);
257 260
258 DCHECK_GE(data_size, 0); 261 DCHECK_GE(data_size, 0);
259 const uint8* start = data; 262 const uint8* start = data;
260 do { 263 do {
261 off_t bytes_left = data_size - (start - data); 264 off_t bytes_left = data_size - (start - data);
262 265
263 if (!FindStartCode(start, bytes_left, offset, start_code_size)) 266 if (!FindStartCode(start, bytes_left, offset, start_code_size))
264 return false; 267 return false;
265 268
266 // Construct a Ranges object that represents the region occupied 269 // Construct a Ranges object that represents the region occupied
267 // by the start code and the 1 byte needed to read the NAL unit type. 270 // by the start code and the 1 byte needed to read the NAL unit type.
268 const uint8* start_code = start + *offset; 271 const uint8* start_code = start + *offset;
269 const uint8* start_code_end = start_code + *start_code_size; 272 const uint8* start_code_end = start_code + *start_code_size;
270 Ranges<const uint8*> start_code_range; 273 Ranges<const uint8*> start_code_range;
271 start_code_range.Add(start_code, start_code_end + 1); 274 start_code_range.Add(start_code, start_code_end + 1);
272 275
273 if (encrypted_ranges_.IntersectionWith(start_code_range).size() > 0) { 276 if (encrypted_ranges.IntersectionWith(start_code_range).size() > 0) {
274 // The start code is inside an encrypted section so we need to scan 277 // The start code is inside an encrypted section so we need to scan
275 // for another start code. 278 // for another start code.
276 *start_code_size = 0; 279 *start_code_size = 0;
277 start += std::min(*offset + 1, bytes_left); 280 start += std::min(*offset + 1, bytes_left);
278 } 281 }
279 } while (*start_code_size == 0); 282 } while (*start_code_size == 0);
280 283
281 // Update |*offset| to include the data we skipped over. 284 // Update |*offset| to include the data we skipped over.
282 *offset += start - data; 285 *offset += start - data;
283 return true; 286 return true;
(...skipping 1032 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 1319
1317 default: 1320 default:
1318 DVLOG(4) << "Unsupported SEI message"; 1321 DVLOG(4) << "Unsupported SEI message";
1319 break; 1322 break;
1320 } 1323 }
1321 1324
1322 return kOk; 1325 return kOk;
1323 } 1326 }
1324 1327
1325 } // namespace media 1328 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/h264_parser.h ('k') | media/filters/h265_parser.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698