15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "media/filters/h264_to_annex_b_bitstream_converter.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace media {
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const uint8 kStartCodePrefix[3] = {0, 0, 1};
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Helper function which determines whether NAL unit of given type marks
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// access unit boundary.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static bool IsAccessUnitBoundaryNal(int nal_unit_type) {
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Check if this packet marks access unit boundary by checking the
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // packet type.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (nal_unit_type == 6 ||  // Supplemental enhancement information
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_type == 7 ||  // Picture parameter set
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_type == 8 ||  // Sequence parameter set
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_type == 9 ||  // Access unit delimiter
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      (nal_unit_type >= 14 && nal_unit_type <= 18)) {  // Reserved types
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return true;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return false;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264ToAnnexBBitstreamConverter::H264ToAnnexBBitstreamConverter()
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : configuration_processed_(false),
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_nal_unit_in_access_unit_(true),
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_length_field_width_(0) {
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)H264ToAnnexBBitstreamConverter::~H264ToAnnexBBitstreamConverter() {}
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 H264ToAnnexBBitstreamConverter::ParseConfigurationAndCalculateSize(
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* configuration_record,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 configuration_record_size) {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FFmpeg's AVCodecContext's extradata field contains the Decoder Specific
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Information from MP4 headers that contain the H.264 SPS and PPS members.
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ISO 14496-15 Chapter 5.2.4 AVCDecoderConfigurationRecord.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // AVCConfigurationRecord must be at least 7 bytes long.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (configuration_record == NULL || configuration_record_size < 7) {
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;  // Error: invalid input
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8* decoder_configuration = configuration_record;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 parameter_set_size_bytes = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can skip the four first bytes as they're only profile information
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration += 4;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fifth byte's two LSBs contain the interleaving field's size minus one
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 size_of_len_field = (*decoder_configuration & 0x3) + 1;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size_of_len_field != 1 && size_of_len_field != 2 &&
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_of_len_field != 4) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;  // Error: invalid input, NAL unit field len is not correct
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration++;
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sixth byte's five LSBs contain the number of SPSs
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 sps_count = *decoder_configuration & 0x1F;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration++;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then we have N * SPS's with two byte length field and actual SPS
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (sps_count-- > 0) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((decoder_configuration - configuration_record) + 2 >
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         static_cast<int32>(configuration_record_size)) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;  // Error: ran out of data
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 sps_len = decoder_configuration[0] << 8 | decoder_configuration[1];
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += 2;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // write the SPS to output, always with zero byte + start code prefix
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parameter_set_size_bytes += 1 + sizeof(kStartCodePrefix);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += sps_len;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parameter_set_size_bytes += sps_len;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then we have the numner of pps in one byte
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 pps_count = *decoder_configuration;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration++;
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And finally, we have N * PPS with two byte length field and actual PPS
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (pps_count-- > 0) {
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if ((decoder_configuration - configuration_record) + 2 >
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         static_cast<int32>(configuration_record_size)) {
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;  // Error: ran out of data
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 pps_len = decoder_configuration[0] << 8 | decoder_configuration[1];
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += 2;
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // write the SPS to output, always with zero byte + start code prefix
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parameter_set_size_bytes += 1 + sizeof(kStartCodePrefix);
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += pps_len;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    parameter_set_size_bytes += pps_len;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We're done processing the AVCDecoderConfigurationRecord,
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // store the needed information for parsing actual payload
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nal_unit_length_field_width_ = size_of_len_field;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  configuration_processed_ = true;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return parameter_set_size_bytes;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)uint32 H264ToAnnexBBitstreamConverter::CalculateNeededOutputBufferSize(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* input,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 input_size) const {
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 output_size = 0;
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 data_left = input_size;
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool first_nal_in_this_access_unit = first_nal_unit_in_access_unit_;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (input == NULL || input_size == 0) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;  // Error: invalid input data
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!configuration_processed_) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;  // Error: configuration not handled, we don't know nal unit width
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(nal_unit_length_field_width_ == 1 ||
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nal_unit_length_field_width_ == 2 ||
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nal_unit_length_field_width_ == 4);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then add the needed size for the actual packet
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (data_left > 0) {
116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    if (data_left < nal_unit_length_field_width_) {
117c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      return 0;  // Error: not enough data for correct conversion.
118c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    }
119c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Read the next NAL unit length from the input buffer
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8 size_of_len_field;
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 nal_unit_length;
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (nal_unit_length = 0, size_of_len_field = nal_unit_length_field_width_;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         size_of_len_field > 0;
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         input++, size_of_len_field--, data_left--) {
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_length <<= 8;
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_length |= *input;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nal_unit_length == 0) {
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;  // Signifies that no more data left in the buffer
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (nal_unit_length > data_left) {
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;  // Error: Not enough data for correct conversion
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_left -= nal_unit_length;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // five least significant bits of first NAL unit byte signify nal_unit_type
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nal_unit_type = *input & 0x1F;
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (first_nal_in_this_access_unit ||
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        IsAccessUnitBoundaryNal(nal_unit_type)) {
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      output_size += 1;  // Extra zero_byte for these nal units
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_nal_in_this_access_unit = false;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Start code prefix
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output_size += sizeof(kStartCodePrefix);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Actual NAL unit size
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    output_size += nal_unit_length;
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    input += nal_unit_length;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No need for trailing zero bits
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return output_size;
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool H264ToAnnexBBitstreamConverter::ConvertAVCDecoderConfigToByteStream(
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* input,
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 input_size,
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* output,
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32* output_size) {
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* outscan = output;
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FFmpeg's AVCodecContext's extradata field contains the Decoder Specific
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Information from MP4 headers that contain the H.264 SPS and PPS members.
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // ISO 14496-15 Chapter 5.2.4 AVCDecoderConfigurationRecord.
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8* decoder_configuration = input;
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 decoderconfiguration_size = input_size;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 out_size = 0;
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (decoder_configuration == NULL || decoderconfiguration_size == 0) {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;  // Error: input invalid
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We can skip the four first bytes as they're only profile information.
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration += 4;
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Fifth byte's two LSBs contain the interleaving field's size minus one
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 size_of_len_field = (*decoder_configuration & 0x3) + 1;
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (size_of_len_field != 1 && size_of_len_field != 2 &&
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      size_of_len_field != 4) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;  // Error: invalid input, NAL unit field len is not correct
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration++;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Sixth byte's five LSBs contain the number of SPSs
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 sps_count = *decoder_configuration & 0x1F;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration++;
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then we have N * SPS's with two byte length field and actual SPS
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (sps_count-- > 0) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 sps_len = decoder_configuration[0] << 8 |
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     decoder_configuration[1];
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += 2;
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out_size + 1 + sizeof(kStartCodePrefix) + sps_len >
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *output_size) {
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *output_size = 0;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;  // too small output buffer;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // write the SPS to output, always with zero byte + start code prefix
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outscan = 0;  // zero byte
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += 1;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(outscan, kStartCodePrefix, sizeof(kStartCodePrefix));
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += sizeof(kStartCodePrefix);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(outscan, decoder_configuration, sps_len);
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += sps_len;
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += sps_len;
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out_size += 1 + sizeof(kStartCodePrefix) + sps_len;
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Then we have the numner of pps in one byte
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8 pps_count = *decoder_configuration;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  decoder_configuration++;
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // And finally, we have N * PPS with two byte length field and actual PPS
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (pps_count-- > 0) {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint16 pps_len = decoder_configuration[0] << 8 | decoder_configuration[1];
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += 2;
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (out_size + 1 + sizeof(kStartCodePrefix) + pps_len >
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        *output_size) {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *output_size = 0;
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;  // too small output buffer;
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // write the SPS to output, always with zero byte + start code prefix
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *outscan = 0;  // zero byte
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += 1;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(outscan, kStartCodePrefix, sizeof(kStartCodePrefix));
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += sizeof(kStartCodePrefix);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(outscan, decoder_configuration, pps_len);
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    decoder_configuration += pps_len;
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += pps_len;
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    out_size += 1 + sizeof(kStartCodePrefix) + pps_len;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // We're done processing the AVCDecoderConfigurationRecord, store the needed
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // information
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  nal_unit_length_field_width_ = size_of_len_field;
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  configuration_processed_ = true;
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *output_size = out_size;
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool H264ToAnnexBBitstreamConverter::ConvertNalUnitStreamToByteStream(
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const uint8* input, uint32 input_size,
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8* output, uint32* output_size) {
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const uint8* inscan = input;  // We read the input from here progressively
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8* outscan = output;  // We write the output to here progressively
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint32 data_left = input_size;
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (inscan == NULL || input_size == 0 ||
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      outscan == NULL || *output_size == 0) {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *output_size = 0;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;  // Error: invalid input
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // NAL unit width should be known at this point
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CHECK(nal_unit_length_field_width_ == 1 ||
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nal_unit_length_field_width_ == 2 ||
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        nal_unit_length_field_width_ == 4);
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Do the actual conversion for the actual input packet
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  while (data_left > 0) {
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint8 i;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 nal_unit_length;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Read the next NAL unit length from the input buffer by scanning
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // the input stream with the specific length field width
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    for (nal_unit_length = 0, i = nal_unit_length_field_width_;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         i > 0 && data_left > 0;
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         inscan++, i--, data_left--) {
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_length <<= 8;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      nal_unit_length |= *inscan;
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (nal_unit_length == 0) {
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;  // Successful conversion, end of buffer
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    } else if (nal_unit_length > data_left) {
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *output_size = 0;
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;  // Error: not enough data for correct conversion
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    uint32 start_code_len;
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    first_nal_unit_in_access_unit_ ?
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        start_code_len = sizeof(kStartCodePrefix) + 1 :
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        start_code_len = sizeof(kStartCodePrefix);
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (static_cast<uint32>(outscan - output) +
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        start_code_len + nal_unit_length > *output_size) {
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *output_size = 0;
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return false;  // Error: too small output buffer
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Five least significant bits of first NAL unit byte signify
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // nal_unit_type.
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int nal_unit_type = *inscan & 0x1F;
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Check if this packet marks access unit boundary by checking the
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // packet type.
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (IsAccessUnitBoundaryNal(nal_unit_type)) {
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_nal_unit_in_access_unit_ = true;
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Write extra zero-byte before start code prefix if this packet
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // signals next access unit.
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (first_nal_unit_in_access_unit_) {
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      *outscan = 0;
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      outscan++;
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      first_nal_unit_in_access_unit_ = false;
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No need to write leading zero bits.
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Write start-code prefix.
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(outscan, kStartCodePrefix, sizeof(kStartCodePrefix));
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += sizeof(kStartCodePrefix);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // Then write the actual NAL unit from the input buffer.
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    memcpy(outscan, inscan, nal_unit_length);
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    inscan += nal_unit_length;
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    data_left -= nal_unit_length;
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    outscan += nal_unit_length;
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // No need for trailing zero bits.
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Successful conversion, output the freshly allocated bitstream buffer.
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *output_size = static_cast<uint32>(outscan - output);
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace media
317