15d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// found in the LICENSE file. 468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/mp2t/es_parser_adts.h" 668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include <list> 868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/basictypes.h" 1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/logging.h" 1168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 1268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "media/base/audio_timestamp_helper.h" 1368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "media/base/bit_reader.h" 1468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "media/base/buffers.h" 1568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "media/base/channel_layout.h" 1668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "media/base/stream_parser_buffer.h" 175d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/mp2t/mp2t_common.h" 185d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/formats/mpeg/adts_constants.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)namespace media { 2168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)static int ExtractAdtsFrameSize(const uint8* adts_header) { 2368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return ((static_cast<int>(adts_header[5]) >> 5) | 2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) (static_cast<int>(adts_header[4]) << 3) | 2568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ((static_cast<int>(adts_header[3]) & 0x3) << 11)); 2668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 2768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static size_t ExtractAdtsFrequencyIndex(const uint8* adts_header) { 2968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return ((adts_header[2] >> 2) & 0xf); 3068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)static size_t ExtractAdtsChannelConfig(const uint8* adts_header) { 3368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return (((adts_header[3] >> 6) & 0x3) | 3468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ((adts_header[2] & 0x1) << 2)); 3568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 3668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 3768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Return true if buf corresponds to an ADTS syncword. 3868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// |buf| size must be at least 2. 3968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)static bool isAdtsSyncWord(const uint8* buf) { 4068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return (buf[0] == 0xff) && ((buf[1] & 0xf6) == 0xf0); 4168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 4268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 4368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Look for an ADTS syncword. 4468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// |new_pos| returns 4568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// - either the byte position of the ADTS frame (if found) 4668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// - or the byte position of 1st byte that was not processed (if not found). 4768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// In every case, the returned value in |new_pos| is such that new_pos >= pos 4868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// |frame_sz| returns the size of the ADTS frame (if found). 4968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// Return whether a syncword was found. 5068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)static bool LookForSyncWord(const uint8* raw_es, int raw_es_size, 5168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int pos, 5268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int* new_pos, int* frame_sz) { 5368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_GE(pos, 0); 5468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_LE(pos, raw_es_size); 5568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int max_offset = raw_es_size - kADTSHeaderMinSize; 5768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (pos >= max_offset) { 5868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Do not change the position if: 5968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // - max_offset < 0: not enough bytes to get a full header 6068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Since pos >= 0, this is a subcase of the next condition. 6168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // - pos >= max_offset: might be the case after reading one full frame, 6268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // |pos| is then incremented by the frame size and might then point 6368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // to the end of the buffer. 6468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) *new_pos = pos; 6568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 6668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 6768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 6868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (int offset = pos; offset < max_offset; offset++) { 6968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const uint8* cur_buf = &raw_es[offset]; 7068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!isAdtsSyncWord(cur_buf)) 7268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The first 12 bits must be 1. 7368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The layer field (2 bits) must be set to 0. 7468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) continue; 7568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 7668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int frame_size = ExtractAdtsFrameSize(cur_buf); 775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (frame_size < kADTSHeaderMinSize) { 7868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Too short to be an ADTS frame. 7968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) continue; 8068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 8168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 8268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Check whether there is another frame 8368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // |size| apart from the current one. 8468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int remaining_size = raw_es_size - offset; 8568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (remaining_size >= frame_size + 2 && 8668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) !isAdtsSyncWord(&cur_buf[frame_size])) { 8768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) continue; 8868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 8968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) *new_pos = offset; 9168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) *frame_sz = frame_size; 9268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 9368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 9468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) *new_pos = max_offset; 9668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 9768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 9868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 9968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)namespace mp2t { 10068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 10168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)EsParserAdts::EsParserAdts( 10268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const NewAudioConfigCB& new_audio_config_cb, 103a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const EmitBufferCB& emit_buffer_cb, 104a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool sbr_in_mimetype) 10568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) : new_audio_config_cb_(new_audio_config_cb), 106a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) emit_buffer_cb_(emit_buffer_cb), 107a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) sbr_in_mimetype_(sbr_in_mimetype) { 10868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 10968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)EsParserAdts::~EsParserAdts() { 11168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 11268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool EsParserAdts::Parse(const uint8* buf, int size, 11468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta pts, 11568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta dts) { 11668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int raw_es_size; 11768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) const uint8* raw_es; 11868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 11968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // The incoming PTS applies to the access unit that comes just after 12068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // the beginning of |buf|. 12168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (pts != kNoTimestamp()) { 12268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) es_byte_queue_.Peek(&raw_es, &raw_es_size); 12368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pts_list_.push_back(EsPts(raw_es_size, pts)); 12468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 12568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 12668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Copy the input data to the ES buffer. 12768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) es_byte_queue_.Push(buf, size); 12868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) es_byte_queue_.Peek(&raw_es, &raw_es_size); 12968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 13068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Look for every ADTS frame in the ES buffer starting at offset = 0 13168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int es_position = 0; 13268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int frame_size; 13368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) while (LookForSyncWord(raw_es, raw_es_size, es_position, 13468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &es_position, &frame_size)) { 13568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DVLOG(LOG_LEVEL_ES) 13668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "ADTS syncword @ pos=" << es_position 13768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << " frame_size=" << frame_size; 13868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DVLOG(LOG_LEVEL_ES) 13968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) << "ADTS header: " 1405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) << base::HexEncode(&raw_es[es_position], kADTSHeaderMinSize); 14168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Do not process the frame if this one is a partial frame. 14368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int remaining_size = raw_es_size - es_position; 14468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (frame_size > remaining_size) 14568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) break; 14668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 14768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Update the audio configuration if needed. 1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DCHECK_GE(frame_size, kADTSHeaderMinSize); 14968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!UpdateAudioConfiguration(&raw_es[es_position])) 15068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 15168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 15268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Get the PTS & the duration of this access unit. 15368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) while (!pts_list_.empty() && 15468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pts_list_.front().first <= es_position) { 15568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) audio_timestamp_helper_->SetBaseTimestamp(pts_list_.front().second); 15668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pts_list_.pop_front(); 15768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 15868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 15968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta current_pts = audio_timestamp_helper_->GetTimestamp(); 16068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta frame_duration = 1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_timestamp_helper_->GetFrameDuration(kSamplesPerAACFrame); 16268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 16368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Emit an audio frame. 16468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) bool is_key_frame = true; 1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // TODO(wolenetz/acolwell): Validate and use a common cross-parser TrackId 1675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // type and allow multiple audio tracks. See https://crbug.com/341581. 16868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) scoped_refptr<StreamParserBuffer> stream_parser_buffer = 16968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) StreamParserBuffer::CopyFrom( 17068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) &raw_es[es_position], 17168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) frame_size, 1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) is_key_frame, 1735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DemuxerStream::AUDIO, 0); 17468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) stream_parser_buffer->SetDecodeTimestamp(current_pts); 17568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) stream_parser_buffer->set_timestamp(current_pts); 17668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) stream_parser_buffer->set_duration(frame_duration); 17768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) emit_buffer_cb_.Run(stream_parser_buffer); 17868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 17968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Update the PTS of the next frame. 1805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) audio_timestamp_helper_->AddFrames(kSamplesPerAACFrame); 18168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Skip the current frame. 18368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) es_position += frame_size; 18468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 18568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Discard all the bytes that have been processed. 18768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DiscardEs(es_position); 18868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 18968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 19068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 19168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EsParserAdts::Flush() { 19368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 19468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 19568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EsParserAdts::Reset() { 19668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) es_byte_queue_.Reset(); 19768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) pts_list_.clear(); 19868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) last_audio_decoder_config_ = AudioDecoderConfig(); 19968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 20068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 20168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)bool EsParserAdts::UpdateAudioConfiguration(const uint8* adts_header) { 2025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t frequency_index = ExtractAdtsFrequencyIndex(adts_header); 2035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (frequency_index >= kADTSFrequencyTableSize) { 20468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Frequency index 13 & 14 are reserved 20568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // while 15 means that the frequency is explicitly written 20668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // (not supported). 20768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 20868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 20968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) size_t channel_configuration = ExtractAdtsChannelConfig(adts_header); 2115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) if (channel_configuration == 0 || 2125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) channel_configuration >= kADTSChannelLayoutTableSize) { 21368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // TODO(damienv): Add support for inband channel configuration. 21468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return false; 21568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 21668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 21768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // TODO(damienv): support HE-AAC frequency doubling (SBR) 21868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // based on the incoming ADTS profile. 2195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int samples_per_second = kADTSFrequencyTable[frequency_index]; 22068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) int adts_profile = (adts_header[2] >> 6) & 0x3; 22168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 222a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // The following code is written according to ISO 14496 Part 3 Table 1.11 and 223a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Table 1.22. (Table 1.11 refers to the capping to 48000, Table 1.22 refers 224a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to SBR doubling the AAC sample rate.) 225a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // TODO(damienv) : Extend sample rate cap to 96kHz for Level 5 content. 226a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) int extended_samples_per_second = sbr_in_mimetype_ 227a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ? std::min(2 * samples_per_second, 48000) 228a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : samples_per_second; 229a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 230c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The following code is written according to ISO 14496 Part 3 Table 1.13 - 231c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Syntax of AudioSpecificConfig. 232c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint16 extra_data_int = 233c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Note: adts_profile is in the range [0,3], since the ADTS header only 234c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // allows two bits for its value. 235c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch ((adts_profile + 1) << 11) + 236c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch (frequency_index << 7) + 237c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch (channel_configuration << 3); 238c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint8 extra_data[2] = { 239c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<uint8>(extra_data_int >> 8), 240c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static_cast<uint8>(extra_data_int & 0xff) 241c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 242c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 24368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) AudioDecoderConfig audio_decoder_config( 24468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) kCodecAAC, 24568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) kSampleFormatS16, 2465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kADTSChannelLayoutTable[channel_configuration], 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) extended_samples_per_second, 248c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch extra_data, 249c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch arraysize(extra_data), 25068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) false); 25168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 25268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (!audio_decoder_config.Matches(last_audio_decoder_config_)) { 25368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DVLOG(1) << "Sampling frequency: " << samples_per_second; 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) DVLOG(1) << "Extended sampling frequency: " << extended_samples_per_second; 25568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DVLOG(1) << "Channel config: " << channel_configuration; 25668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DVLOG(1) << "Adts profile: " << adts_profile; 25768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Reset the timestamp helper to use a new time scale. 25868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (audio_timestamp_helper_) { 25968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::TimeDelta base_timestamp = audio_timestamp_helper_->GetTimestamp(); 26068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) audio_timestamp_helper_.reset( 26168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new AudioTimestampHelper(samples_per_second)); 26268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) audio_timestamp_helper_->SetBaseTimestamp(base_timestamp); 26368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } else { 26468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) audio_timestamp_helper_.reset( 26568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new AudioTimestampHelper(samples_per_second)); 26668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 26768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Audio config notification. 26868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) last_audio_decoder_config_ = audio_decoder_config; 26968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) new_audio_config_cb_.Run(audio_decoder_config); 27068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 27168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 27268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return true; 27368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 27468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 27568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)void EsParserAdts::DiscardEs(int nbytes) { 27668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) DCHECK_GE(nbytes, 0); 27768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) if (nbytes <= 0) 27868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return; 27968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Adjust the ES position of each PTS. 28168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) for (EsPtsList::iterator it = pts_list_.begin(); it != pts_list_.end(); ++it) 28268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) it->first -= nbytes; 28368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Discard |nbytes| of ES. 28568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) es_byte_queue_.Pop(nbytes); 28668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 28768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 28868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace mp2t 28968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} // namespace media 29068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 291