| OLD | NEW |
| (Empty) |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | |
| 2 // Use of this source code is governed by a BSD-style license that can be | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef MEDIA_BASE_H264_BITSTREAM_CONVERTER_H_ | |
| 6 #define MEDIA_BASE_H264_BITSTREAM_CONVERTER_H_ | |
| 7 | |
| 8 #include "base/basictypes.h" | |
| 9 #include "media/base/media_export.h" | |
| 10 | |
| 11 namespace media { | |
| 12 | |
| 13 // H264BitstreamConverter is a class to convert H.264 bitstream from | |
| 14 // MP4 format (as specified in ISO/IEC 14496-15) into H.264 bytestream | |
| 15 // (as specified in ISO/IEC 14496-10 Annex B). | |
| 16 class MEDIA_EXPORT H264BitstreamConverter { | |
| 17 public: | |
| 18 H264BitstreamConverter(); | |
| 19 ~H264BitstreamConverter(); | |
| 20 | |
| 21 // Parses the global AVCDecoderConfigurationRecord from the file format's | |
| 22 // headers. Converter will remember the field length from the configuration | |
| 23 // headers after this. | |
| 24 // | |
| 25 // Parameters | |
| 26 // configuration_record | |
| 27 // Pointer to buffer containing AVCDecoderConfigurationRecord. | |
| 28 // configuration_record_size | |
| 29 // Size of the buffer in bytes. | |
| 30 // | |
| 31 // Returns | |
| 32 // Required buffer size for AVCDecoderConfigurationRecord when converted | |
| 33 // to bytestream format, or 0 if could not determine the configuration | |
| 34 // from the input buffer. | |
| 35 uint32 ParseConfigurationAndCalculateSize(const uint8* configuration_record, | |
| 36 uint32 configuration_record_size); | |
| 37 | |
| 38 // Calculates needed buffer size for the bitstream converted into bytestream. | |
| 39 // Lightweight implementation that does not do the actual conversion. | |
| 40 // | |
| 41 // Parameters | |
| 42 // configuration_record | |
| 43 // Pointer to buffer containing AVCDecoderConfigurationRecord. | |
| 44 // configuration_record_size | |
| 45 // Size of the buffer in bytes. | |
| 46 // | |
| 47 // Returns | |
| 48 // Required buffer size for the input NAL unit buffer when converted | |
| 49 // to bytestream format, or 0 if could not determine the configuration | |
| 50 // from the input buffer. | |
| 51 uint32 CalculateNeededOutputBufferSize(const uint8* input, | |
| 52 uint32 input_size) const; | |
| 53 | |
| 54 // ConvertParameterSetsToByteStream converts the | |
| 55 // AVCDecoderConfigurationRecord from the MP4 headers to bytestream format. | |
| 56 // Client is responsible for making sure the output buffer is large enough | |
| 57 // to hold the output data. Client can precalculate the needed output buffer | |
| 58 // size by using ParseConfigurationAndCalculateSize. | |
| 59 // | |
| 60 // In case of failed conversion object H264BitstreamConverter may have written | |
| 61 // some bytes to buffer pointed by pinput but user should ignore those bytes. | |
| 62 // None of the outputs should be considered valid. | |
| 63 // | |
| 64 // Parameters | |
| 65 // pinput | |
| 66 // Pointer to buffer containing AVCDecoderConfigurationRecord. | |
| 67 // input_size | |
| 68 // Size of the buffer in bytes. | |
| 69 // poutput | |
| 70 // Pointer to buffer where the output should be written to. | |
| 71 // poutput_size (i/o) | |
| 72 // Pointer to the size of the output buffer. Will contain the number of | |
| 73 // bytes written to output after successful call. | |
| 74 // | |
| 75 // Returns | |
| 76 // true if successful conversion | |
| 77 // false if conversion not successful (poutput_size will hold the amount | |
| 78 // of converted data) | |
| 79 bool ConvertAVCDecoderConfigurationRecordToByteStream(const uint8* input, | |
| 80 uint32 input_size, | |
| 81 uint8* output, | |
| 82 uint32* output_size); | |
| 83 | |
| 84 // ConvertNalUnitStreamToByteStream converts the NAL unit from MP4 format | |
| 85 // to bytestream format. Client is responsible for making sure the output | |
| 86 // buffer is large enough to hold the output data. Client can precalculate the | |
| 87 // needed output buffer size by using CalculateNeededOutputBufferSize. | |
| 88 // | |
| 89 // In case of failed conversion object H264BitstreamConverter may have written | |
| 90 // some bytes to buffer pointed by pinput but user should ignore those bytes. | |
| 91 // None of the outputs should be considered valid. | |
| 92 // | |
| 93 // Parameters | |
| 94 // pinput | |
| 95 // Pointer to buffer containing AVCDecoderConfigurationRecord. | |
| 96 // input_size | |
| 97 // Size of the buffer in bytes. | |
| 98 // poutput | |
| 99 // Pointer to buffer where the output should be written to. | |
| 100 // poutput_size (i/o) | |
| 101 // Pointer to the size of the output buffer. Will contain the number of | |
| 102 // bytes written to output after successful call. | |
| 103 // | |
| 104 // Returns | |
| 105 // true if successful conversion | |
| 106 // false if conversion not successful (poutput_size will hold the amount | |
| 107 // of converted data) | |
| 108 bool ConvertNalUnitStreamToByteStream(const uint8* input, uint32 input_size, | |
| 109 uint8* output, uint32* output_size); | |
| 110 | |
| 111 private: | |
| 112 // Flag for indicating whether global parameter sets have been processed. | |
| 113 bool configuration_processed_; | |
| 114 // Flag for indicating whether next NAL unit starts new access unit. | |
| 115 bool first_nal_unit_in_access_unit_; | |
| 116 // Variable to hold interleaving field's length in bytes. | |
| 117 uint8 nal_unit_length_field_width_; | |
| 118 | |
| 119 DISALLOW_COPY_AND_ASSIGN(H264BitstreamConverter); | |
| 120 }; | |
| 121 | |
| 122 } // namespace media | |
| 123 | |
| 124 #endif // MEDIA_BASE_H264_BITSTREAM_CONVERTER_H_ | |
| 125 | |
| OLD | NEW |