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 // This file contains an implementation of an H264 Annex-B video stream parser. | 5 // This file contains an implementation of an H264 Annex-B video stream parser. |
6 | 6 |
7 #ifndef MEDIA_FILTERS_H264_PARSER_H_ | 7 #ifndef MEDIA_FILTERS_H264_PARSER_H_ |
8 #define MEDIA_FILTERS_H264_PARSER_H_ | 8 #define MEDIA_FILTERS_H264_PARSER_H_ |
9 | 9 |
10 #include <sys/types.h> | 10 #include <sys/types.h> |
11 | 11 |
12 #include <map> | 12 #include <map> |
13 #include <vector> | |
13 | 14 |
14 #include "base/basictypes.h" | 15 #include "base/basictypes.h" |
15 #include "media/base/media_export.h" | 16 #include "media/base/media_export.h" |
17 #include "media/base/ranges.h" | |
16 #include "media/filters/h264_bit_reader.h" | 18 #include "media/filters/h264_bit_reader.h" |
17 | 19 |
18 namespace media { | 20 namespace media { |
19 | 21 |
22 struct SubsampleEntry; | |
23 | |
20 // For explanations of each struct and its members, see H.264 specification | 24 // For explanations of each struct and its members, see H.264 specification |
21 // at http://www.itu.int/rec/T-REC-H.264. | 25 // at http://www.itu.int/rec/T-REC-H.264. |
22 struct MEDIA_EXPORT H264NALU { | 26 struct MEDIA_EXPORT H264NALU { |
23 H264NALU(); | 27 H264NALU(); |
24 | 28 |
25 enum Type { | 29 enum Type { |
26 kUnspecified = 0, | 30 kUnspecified = 0, |
27 kNonIDRSlice = 1, | 31 kNonIDRSlice = 1, |
28 kSliceDataA = 2, | 32 kSliceDataA = 2, |
29 kSliceDataB = 3, | 33 kSliceDataB = 3, |
(...skipping 300 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
330 // - |*start_code_size| is either 0, 3 or 4. | 334 // - |*start_code_size| is either 0, 3 or 4. |
331 static bool FindStartCode(const uint8* data, off_t data_size, | 335 static bool FindStartCode(const uint8* data, off_t data_size, |
332 off_t* offset, off_t* start_code_size); | 336 off_t* offset, off_t* start_code_size); |
333 | 337 |
334 H264Parser(); | 338 H264Parser(); |
335 ~H264Parser(); | 339 ~H264Parser(); |
336 | 340 |
337 void Reset(); | 341 void Reset(); |
338 // Set current stream pointer to |stream| of |stream_size| in bytes, | 342 // Set current stream pointer to |stream| of |stream_size| in bytes, |
339 // |stream| owned by caller. | 343 // |stream| owned by caller. |
344 // |subsamples| contains information about what parts of |stream| are | |
345 // encrypted. | |
340 void SetStream(const uint8* stream, off_t stream_size); | 346 void SetStream(const uint8* stream, off_t stream_size); |
347 void SetEncryptedStream(const uint8* stream, off_t stream_size, | |
348 const std::vector<SubsampleEntry>& subsamples); | |
341 | 349 |
342 // Read the stream to find the next NALU, identify it and return | 350 // Read the stream to find the next NALU, identify it and return |
343 // that information in |*nalu|. This advances the stream to the beginning | 351 // that information in |*nalu|. This advances the stream to the beginning |
344 // of this NALU, but not past it, so subsequent calls to NALU-specific | 352 // of this NALU, but not past it, so subsequent calls to NALU-specific |
345 // parsing functions (ParseSPS, etc.) will parse this NALU. | 353 // parsing functions (ParseSPS, etc.) will parse this NALU. |
346 // If the caller wishes to skip the current NALU, it can call this function | 354 // If the caller wishes to skip the current NALU, it can call this function |
347 // again, instead of any NALU-type specific parse functions below. | 355 // again, instead of any NALU-type specific parse functions below. |
348 Result AdvanceToNextNALU(H264NALU* nalu); | 356 Result AdvanceToNextNALU(H264NALU* nalu); |
349 | 357 |
350 // NALU-specific parsing functions. | 358 // NALU-specific parsing functions. |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
385 private: | 393 private: |
386 // Move the stream pointer to the beginning of the next NALU, | 394 // Move the stream pointer to the beginning of the next NALU, |
387 // i.e. pointing at the next start code. | 395 // i.e. pointing at the next start code. |
388 // Return true if a NALU has been found. | 396 // Return true if a NALU has been found. |
389 // If a NALU is found: | 397 // If a NALU is found: |
390 // - its size in bytes is returned in |*nalu_size| and includes | 398 // - its size in bytes is returned in |*nalu_size| and includes |
391 // the start code as well as the trailing zero bits. | 399 // the start code as well as the trailing zero bits. |
392 // - the size in bytes of the start code is returned in |*start_code_size|. | 400 // - the size in bytes of the start code is returned in |*start_code_size|. |
393 bool LocateNALU(off_t* nalu_size, off_t* start_code_size); | 401 bool LocateNALU(off_t* nalu_size, off_t* start_code_size); |
394 | 402 |
403 // Wrapper for FindStartCode() that skips over start codes that | |
404 // may appear outside of |clear_ranges_|. | |
405 bool FindStartCodeInClearRanges(const uint8* data, off_t data_size, | |
xhwang
2014/07/16 05:06:13
Comment about the meaning of the returned value.
acolwell GONE FROM CHROMIUM
2014/07/28 19:43:12
Done.
| |
406 off_t* offset, off_t* start_code_size); | |
407 | |
395 // Exp-Golomb code parsing as specified in chapter 9.1 of the spec. | 408 // Exp-Golomb code parsing as specified in chapter 9.1 of the spec. |
396 // Read one unsigned exp-Golomb code from the stream and return in |*val|. | 409 // Read one unsigned exp-Golomb code from the stream and return in |*val|. |
397 Result ReadUE(int* val); | 410 Result ReadUE(int* val); |
398 | 411 |
399 // Read one signed exp-Golomb code from the stream and return in |*val|. | 412 // Read one signed exp-Golomb code from the stream and return in |*val|. |
400 Result ReadSE(int* val); | 413 Result ReadSE(int* val); |
401 | 414 |
402 // Parse scaling lists (see spec). | 415 // Parse scaling lists (see spec). |
403 Result ParseScalingList(int size, int* scaling_list, bool* use_default); | 416 Result ParseScalingList(int size, int* scaling_list, bool* use_default); |
404 Result ParseSPSScalingLists(H264SPS* sps); | 417 Result ParseSPSScalingLists(H264SPS* sps); |
(...skipping 29 matching lines...) Expand all Loading... | |
434 off_t bytes_left_; | 447 off_t bytes_left_; |
435 | 448 |
436 H264BitReader br_; | 449 H264BitReader br_; |
437 | 450 |
438 // PPSes and SPSes stored for future reference. | 451 // PPSes and SPSes stored for future reference. |
439 typedef std::map<int, H264SPS*> SPSById; | 452 typedef std::map<int, H264SPS*> SPSById; |
440 typedef std::map<int, H264PPS*> PPSById; | 453 typedef std::map<int, H264PPS*> PPSById; |
441 SPSById active_SPSes_; | 454 SPSById active_SPSes_; |
442 PPSById active_PPSes_; | 455 PPSById active_PPSes_; |
443 | 456 |
457 Ranges<const uint8*> clear_ranges_; | |
458 size_t clear_range_index_; | |
xhwang
2014/07/16 05:06:13
Comment this variable.
acolwell GONE FROM CHROMIUM
2014/07/28 19:43:12
Variable no longer exists.
| |
459 | |
444 DISALLOW_COPY_AND_ASSIGN(H264Parser); | 460 DISALLOW_COPY_AND_ASSIGN(H264Parser); |
445 }; | 461 }; |
446 | 462 |
447 } // namespace media | 463 } // namespace media |
448 | 464 |
449 #endif // MEDIA_FILTERS_H264_PARSER_H_ | 465 #endif // MEDIA_FILTERS_H264_PARSER_H_ |
OLD | NEW |