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