blob: e0aac357ae188f2ea20b1c8c1667bc36e28f66e7 [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "media/formats/mp4/dts.h"
#include "base/logging.h"
#include "media/base/bit_reader.h"
#include "media/formats/mp4/rcheck.h"
namespace media {
namespace mp4 {
DTS::DTS() = default;
DTS::DTS(const DTS& other) = default;
DTS::~DTS() = default;
bool DTS::Parse(const std::vector<uint8_t>& data, MediaLog* media_log) {
if (data.empty())
return false;
if (data.size() < (32 * 3 + 8 + 2 + 8) / 8)
return false;
// Parse ddts box using reader.
BitReader reader(&data[0], data.size());
// Parse Sample frequency
RCHECK(reader.ReadBits(32, &dts_sampling_frequency_));
// Parse Max Bitrate
RCHECK(reader.ReadBits(32, &max_bitrate_));
// Parse Avg Bitrate
RCHECK(reader.ReadBits(32, &avg_bitrate_));
// Parse PCM Sample Depth
RCHECK(reader.ReadBits(8, &pcm_sample_depth_));
// Parse Frame Duration
uint8_t frame_duration_code = 0;
RCHECK(reader.ReadBits(2, &frame_duration_code));
switch (frame_duration_code) {
case 0:
frame_duration_ = 512;
break;
case 1:
frame_duration_ = 1024;
break;
case 2:
frame_duration_ = 2048;
break;
case 3:
frame_duration_ = 4096;
break;
default:
frame_duration_ = 0;
break;
}
LogDtsParameters();
return true;
}
int DTS::GetFrameDuration() const {
return frame_duration_;
}
uint32_t DTS::GetDtsSamplingFrequency() const {
return dts_sampling_frequency_;
}
uint32_t DTS::GetMaxBitrate() const {
return max_bitrate_;
}
uint32_t DTS::GetAvgBitrate() const {
return avg_bitrate_;
}
uint8_t DTS::GetPcmSampleDepth() const {
return pcm_sample_depth_;
}
void DTS::LogDtsParameters() {
DVLOG(3) << "dts_sampling_freq " << dts_sampling_frequency_ << "max_bitrate "
<< max_bitrate_ << "avg_bitrate " << avg_bitrate_
<< "pcm_sample_depth " << static_cast<int>(pcm_sample_depth_)
<< "frame_duration " << frame_duration_;
}
} // namespace mp4
} // namespace media