// Copyright 2012 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "cobalt/media/filters/shell_mp4_parser.h"

#include <inttypes.h>
#include <limits>
#include <vector>

#include "base/strings/stringprintf.h"
#include "cobalt/media/base/endian_util.h"
#include "cobalt/media/formats/mp4/es_descriptor.h"
#include "starboard/types.h"

namespace cobalt {
namespace media {

// how many bytes to skip within an avc1 before the config atoms start?
static const int kSkipBytes_avc1 = 78;

// what's the smallest meaningful mp4 atom size?
static const int kAtomMinSize = 8;

// Full Box has a one byte version and three bytes flags after the header
static const int kFullBoxHeaderAndFlagSize = 4;

// how much to download of an hdlr to get the trak type?
static const int kDesiredBytes_hdlr = 12;
static const uint32 kAudioSubtype_hdlr_soun = 0x736f756e;
static const uint32 kVideoSubtype_hdlr_vide = 0x76696465;

// how much to download of an mp4a to determine version number?
static const int kDesiredBytes_mp4a = 2;
// how big is the mp4a atom before optional extension atoms?
static const int kTotalSize_mp4a_v0 = 28;
static const int kTotalSize_mp4a_v1 = 44;
static const int kTotalSize_mp4a_v2 = 64;

// how many bytes should we download from an mdhd?
static const int kDesiredBytes_mdhd = 20;

// how many bytes should we download from an mvhd?
static const int kDesiredBytes_mvhd = 20;

// how many bytes to skip within an stsd before the config atoms start?
static const int kSkipBytes_stsd = 8;

// use average values of mp4 metadata tables plus 2 standard deviations to
// hold most metadata atoms entirely in memory.
static const int kMapTableAtomCacheEntries_stsz = 260591 / kEntrySize_stsz;
static const int kMapTableAtomCacheEntries_stco = 22859 / kEntrySize_stco;
static const int kMapTableAtomCacheEntries_stss = 3786 / kEntrySize_stss;
static const int kMapTableAtomCacheEntries_stts = 164915 / kEntrySize_stts;
static const int kMapTableAtomCacheEntries_stsc = 32199 / kEntrySize_stsc;
static const int kMapTableAtomCacheEntries_co64 = 740212 / kEntrySize_co64;
static const int kMapTableAtomCacheEntries_ctts = 51543 / kEntrySize_ctts;

// static
PipelineStatus ShellMP4Parser::Construct(
    scoped_refptr<ShellDataSourceReader> reader,
    const uint8* construction_header, scoped_refptr<ShellParser>* parser,
    const scoped_refptr<MediaLog>& media_log) {
  DCHECK(parser);
  DCHECK(media_log);
  *parser = NULL;

  // detect mp4 stream by looking for ftyp atom at top of file
  uint32 ftyp = endian_util::load_uint32_big_endian(construction_header + 4);
  if (ftyp != kAtomType_ftyp) {
    // not an mp4
    return DEMUXER_ERROR_COULD_NOT_PARSE;
  }

  // first 4 bytes will be the size of the ftyp atom
  uint32 ftyp_atom_size =
      endian_util::load_uint32_big_endian(construction_header);
  if (ftyp_atom_size < kAtomMinSize) {
    return DEMUXER_ERROR_COULD_NOT_PARSE;
  }

  // construct new mp4 parser
  *parser = new ShellMP4Parser(reader, ftyp_atom_size, media_log);
  return PIPELINE_OK;
}

ShellMP4Parser::ShellMP4Parser(scoped_refptr<ShellDataSourceReader> reader,
                               uint32 ftyp_atom_size,
                               const scoped_refptr<MediaLog>& media_log)
    : ShellAVCParser(reader, media_log),
      atom_offset_(ftyp_atom_size),  // start at next atom, skipping over ftyp
      current_trak_is_video_(false),
      current_trak_is_audio_(false),
      current_trak_time_scale_(0),
      video_time_scale_hz_(0),
      audio_time_scale_hz_(0),
      audio_map_(new ShellMP4Map(reader)),
      video_map_(new ShellMP4Map(reader)),
      audio_sample_(0),
      video_sample_(0),
      first_audio_hole_ticks_(0),
      first_audio_hole_(base::TimeDelta::FromSeconds(0)) {}

ShellMP4Parser::~ShellMP4Parser() {}

// For MP4 we traverse the file's atom structure attempting to find the audio
// and video configuration information and the locations in the file of the
// various stbl subatoms which detail the position of the audio and video
// NALUs in the file. As some of the stbl subatoms can be quite large we cache
// a fixed maximum quantity of each stbl subatom and update the cache only on
// miss.
bool ShellMP4Parser::ParseConfig() {
  while (!IsConfigComplete() || !audio_map_->IsComplete() ||
         !video_map_->IsComplete()) {
    if (!ParseNextAtom()) {
      return false;
    }
  }
  return true;
}

scoped_refptr<ShellAU> ShellMP4Parser::GetNextAU(DemuxerStream::Type type) {
  uint32 size = 0;
  uint32 duration_ticks = 0;
  uint64 timestamp_ticks = 0;
  uint64 offset = 0;
  bool is_keyframe = false;
  base::TimeDelta timestamp;
  base::TimeDelta duration;
  if (type == DemuxerStream::AUDIO) {
    if (audio_time_scale_hz_ == 0) {
      DLOG(ERROR) << "|audio_time_scale_hz_| cannot be 0.";
      return NULL;
    }
    if (!audio_map_->GetSize(audio_sample_, &size) ||
        !audio_map_->GetOffset(audio_sample_, &offset) ||
        !audio_map_->GetDuration(audio_sample_, &duration_ticks) ||
        !audio_map_->GetTimestamp(audio_sample_, &timestamp_ticks)) {
      // determine if EOS or error
      if (audio_map_->IsEOS(audio_sample_)) {
        return ShellAU::CreateEndOfStreamAU(DemuxerStream::AUDIO,
                                            audio_track_duration_);
      } else {
        DLOG(ERROR) << "parsed bad audio AU";
        return NULL;
      }
    }
    // all aac frames are random-access, so all are keyframes
    is_keyframe = true;
    audio_sample_++;
    timestamp = TicksToTime(timestamp_ticks, audio_time_scale_hz_);
    duration = TicksToTime(duration_ticks, audio_time_scale_hz_);

    // It would be very unusual to encounter non-contiguous audio
    // in an mp4, but you never know. Make sure this timestamp is
    // contiguous in ticks from the last one
    if (first_audio_hole_ticks_ == timestamp_ticks) {
      // Much of the audio stack assumes that audio timestamps are
      // contiguous. While the timestamps coming out of the map are
      // normally continuous, they are on a different time scale. Due
      // to roundoff error in conversion the timestamps produced may
      // be discontinuous. To correct this we correct the timestamp
      // to the one the system is expecting for continuity, then modify
      // the duration by the negative of that same (small) value,
      // so as to not accumulate roundoff error over time.
      base::TimeDelta time_difference = timestamp - first_audio_hole_;
      timestamp = first_audio_hole_;
      duration += time_difference;
      first_audio_hole_ = timestamp + duration;
      first_audio_hole_ticks_ += duration_ticks;
    } else {
      DLOG(WARNING) << "parsed non-contiguous mp4 audio timestamp";
      // reset hole tracking past gap
      first_audio_hole_ticks_ = timestamp_ticks + duration_ticks;
      first_audio_hole_ = timestamp + duration;
    }
  } else if (type == DemuxerStream::VIDEO) {
    if (video_time_scale_hz_ == 0) {
      DLOG(ERROR) << "|video_time_scale_hz_| cannot be 0.";
      return NULL;
    }
    if (!video_map_->GetSize(video_sample_, &size) ||
        !video_map_->GetOffset(video_sample_, &offset) ||
        !video_map_->GetDuration(video_sample_, &duration_ticks) ||
        !video_map_->GetTimestamp(video_sample_, &timestamp_ticks) ||
        !video_map_->GetIsKeyframe(video_sample_, &is_keyframe)) {
      if (video_map_->IsEOS(video_sample_)) {
        return ShellAU::CreateEndOfStreamAU(DemuxerStream::VIDEO,
                                            video_track_duration_);
      } else {
        DLOG(ERROR) << "parsed bad video AU";
        return NULL;
      }
    }
    video_sample_++;
    timestamp = TicksToTime(timestamp_ticks, video_time_scale_hz_);
    duration = TicksToTime(duration_ticks, video_time_scale_hz_);
    // due to b-frames it's much more likely we'll encounter discontinuous
    // video buffers. As a result we add a small duration to each video
    // buffer, equal in value to one full tick at the video timescale. The
    // showing of video frames is actually keyed on the audio clock, so this
    // shouldn't create too much jitter in the output.
    duration += one_video_tick_;
  } else {
    NOTREACHED() << "unsupported stream type";
    return NULL;
  }

  size_t prepend_size = CalculatePrependSize(type, is_keyframe);

  if (type == DemuxerStream::AUDIO)
    return ShellAU::CreateAudioAU(offset, size, prepend_size, is_keyframe,
                                  timestamp, duration, this);
  return ShellAU::CreateVideoAU(offset, size, prepend_size, nal_header_size_,
                                is_keyframe, timestamp, duration, this);
}

bool ShellMP4Parser::SeekTo(base::TimeDelta timestamp) {
  if (audio_time_scale_hz_ == 0 || video_time_scale_hz_ == 0) {
    DLOG_IF(ERROR, audio_time_scale_hz_ == 0)
        << "|audio_time_scale_hz_| cannot be 0.";
    DLOG_IF(ERROR, video_time_scale_hz_ == 0)
        << "|video_time_scale_hz_| cannot be 0.";
    return false;
  }

  // get video timestamp in video time units
  uint64 video_ticks = TimeToTicks(timestamp, video_time_scale_hz_);
  // find nearest keyframe from map, make it our next video sample
  if (!video_map_->GetKeyframe(video_ticks, &video_sample_)) {
    return false;
  }
  // get the timestamp for this video keyframe
  uint64 video_keyframe_time_ticks = 0;
  if (!video_map_->GetTimestamp(video_sample_, &video_keyframe_time_ticks)) {
    return false;
  }
  base::TimeDelta video_keyframe_time =
      TicksToTime(video_keyframe_time_ticks, video_time_scale_hz_);
  // find the closest audio frame that bounds that timestamp
  uint64 audio_ticks = TimeToTicks(video_keyframe_time, audio_time_scale_hz_);
  if (!audio_map_->GetKeyframe(audio_ticks, &audio_sample_)) {
    return false;
  }
  DLOG(INFO) << base::StringPrintf(
      "seeking to timestamp: %" PRId64 ", video sample: %d, audio sample: %d",
      timestamp.InMilliseconds(), video_sample_, audio_sample_);
  // cheat our buffer continuity system
  if (!audio_map_->GetTimestamp(audio_sample_, &first_audio_hole_ticks_)) {
    return false;
  }
  first_audio_hole_ =
      TicksToTime(first_audio_hole_ticks_, audio_time_scale_hz_);
  return true;
}

// parse the atom starting at atom_offset_, update appropriate internal state,
// return false on fatal error. General structure of an MP4 atom is:
// field             | type   | comment
// ------------------+--------+---------
// atom size         | uint32 | if 0 means "rest of file", if 1 means extended
// fourCC code       | ASCII  | four-byte ASCII code we treat as uint32
// extended size     | uint64 | optional size field, only here if atom size is 1
// <--- rest of atom body starts here
bool ShellMP4Parser::ParseNextAtom() {
  uint8 atom[kAtomDownload];
  int bytes_read = reader_->BlockingRead(atom_offset_, kAtomDownload, atom);
  if (bytes_read < kAtomDownload) {
    return false;
  }
  // first 4 bytes are size of atom uint32
  uint64 atom_size =
      static_cast<uint64>(endian_util::load_uint32_big_endian(atom));
  // normally atom body starts just past fourCC code
  uint32 atom_body = kAtomMinSize;
  // if 1 we need to load the extended size which will be appended just past
  // the fourCC code
  if (atom_size == 1) {
    atom_size = endian_util::load_uint64_big_endian(atom + 8);
    // advance atom_body past the 8 bytes of size we just parsed
    atom_body += 8;
  } else if (atom_size == 0) {
    // calculate size of this atom from remainder of file
    DCHECK_LE(atom_offset_,
              static_cast<uint64>(std::numeric_limits<int64>::max()));
    if (reader_->FileSize() > static_cast<int64>(atom_offset_)) {
      atom_size = reader_->FileSize() - atom_offset_;
    }
  }
  // atom sizes also include the size of the start of the atom, so sanity-check
  // the size we just parsed against the number of bytes we needed to parse it
  if (atom_size < atom_body) {
    DLOG(WARNING) << base::StringPrintf("atom size: %" PRId64
                                        " less than min body size %d",
                                        atom_size, atom_body);
    return false;
  }

  // extract fourCC code as big-endian uint32
  uint32 four_cc = endian_util::load_uint32_big_endian(atom + 4);
  DLOG(INFO) << base::StringPrintf("four_cc: %c%c%c%c", atom[4], atom[5],
                                   atom[6], atom[7]);

  // advance read pointer to atom body
  atom_offset_ += atom_body;
  // adjust size of body of atom from size of header
  uint64 atom_data_size = atom_size - atom_body;

  bool atom_parse_success = true;

  // We use 95% certainty intervals for video metadata atom sizes. The map
  // is written to handle larger atom sizes but having to recache metadata
  // increases latencies on things like seeks.
  int map_table_atom_cache_entries = 0;

  // now take appropriate action based on atom type
  switch (four_cc) {
    // avc1 atoms are contained within stsd atoms and carry their own
    // configuration baggage load, which we skip over and parse the atoms
    // within, normally an avcC atom.
    case kAtomType_avc1:
      atom_offset_ += kSkipBytes_avc1;
      break;

    // avcC atoms contain the AVCConfigRecord, our video configuration info
    case kAtomType_avcC:
      atom_parse_success =
          DownloadAndParseAVCConfigRecord(atom_offset_, atom_data_size);
      if (atom_parse_success) atom_offset_ += atom_data_size;
      break;

    // esds atoms contain actually usable audio configuration info for AAC.
    case kAtomType_esds:
      return ParseMP4_esds(atom_data_size);

    // can tell us if mdia and mdhd atoms relate to audio or video metadata
    case kAtomType_hdlr:
      return ParseMP4_hdlr(atom_data_size, atom + atom_body);

    // provides a duration and a timescale unique to a given track
    case kAtomType_mdhd:
      return ParseMP4_mdhd(atom_data_size, atom + atom_body);

    // mp4a atoms contain audio configuration info, but we only want to know
    // which version it is so we can skip to the esds, which we must be present
    // when using AAC
    case kAtomType_mp4a:
      return ParseMP4_mp4a(atom_data_size, atom + atom_body);

    // movie header atom contains track duration and time unit scale, we trust
    // these data as the authoritative duration data for the mp4
    case kAtomType_mvhd:
      return ParseMP4_mvhd(atom_data_size, atom + atom_body);

    // stsd atoms may contain avc1 atoms, which themselves may contain avcC
    // atoms, which contain actually usable configuration information. skip to
    // subatom.
    case kAtomType_stsd:
      atom_offset_ += kSkipBytes_stsd;
      break;

    // We're very much interested in the contents of the trak container atom,
    // blow away state that we may have been keeping about any prior trak
    // atoms we've parsed.
    case kAtomType_trak:
      current_trak_is_video_ = false;
      current_trak_is_audio_ = false;
      break;

    // if one of the stbl subatoms add it to the appropriate audio or video map
    // and then advance past it.
    case kAtomType_co64:
      map_table_atom_cache_entries = kMapTableAtomCacheEntries_co64;
      break;

    case kAtomType_ctts:
      map_table_atom_cache_entries = kMapTableAtomCacheEntries_ctts;
      break;

    case kAtomType_stco:
      map_table_atom_cache_entries = kMapTableAtomCacheEntries_stco;
      break;

    case kAtomType_stts:
      map_table_atom_cache_entries = kMapTableAtomCacheEntries_stts;
      break;

    case kAtomType_stsc:
      map_table_atom_cache_entries = kMapTableAtomCacheEntries_stsc;
      break;

    case kAtomType_stss:
      map_table_atom_cache_entries = kMapTableAtomCacheEntries_stss;
      break;

    case kAtomType_stsz:
      map_table_atom_cache_entries = kMapTableAtomCacheEntries_stsz;
      break;

    // these are container atoms, so we dont want to advance past the header
    // as we are interested in their contents. Parsing them is trivial
    // as all they are is a size header and a fourCC type tag, which we've
    // already parsed and advanced past.
    case kAtomType_mdia:
    case kAtomType_minf:
    case kAtomType_moov:
    case kAtomType_stbl:
      // no-op
      break;

    // known atom types that we wish to just skip past the body without warning
    case kAtomType_dinf:
    case kAtomType_dref:
    case kAtomType_smhd:
    case kAtomType_tkhd:
    case kAtomType_vmhd:
      atom_offset_ += atom_data_size;
      break;

    // parse functions are assumed to advance read_position_ themselves,
    // as we are flattening a tree of atoms so that the atom_size we parsed
    // this time, if it's a container, may not have been entirely consumed
    // in this single call. However for unsupported atoms we just skip them
    // entirely, meaning we will skip their contents too.
    default:
      atom_offset_ += atom_data_size;
      DLOG(INFO) << base::StringPrintf(
          "skipping unsupported MP4 atom: %c%c%c%c", atom[4], atom[5], atom[6],
          atom[7]);
      break;
  }

  if (map_table_atom_cache_entries > 0) {
    if (current_trak_is_video_) {
      atom_parse_success =
          video_map_->SetAtom(four_cc, atom_offset_, atom_data_size,
                              map_table_atom_cache_entries, atom + atom_body);
    } else if (current_trak_is_audio_) {
      atom_parse_success =
          audio_map_->SetAtom(four_cc, atom_offset_, atom_data_size,
                              map_table_atom_cache_entries, atom + atom_body);
    }
    atom_offset_ += atom_data_size;
  }

  if (!atom_parse_success) {
    DLOG(ERROR) << base::StringPrintf("Unable to parse MP4 atom: %c%c%c%c",
                                      atom[4], atom[5], atom[6], atom[7]);
  }

  return atom_parse_success;
}

bool ShellMP4Parser::ParseMP4_esds(uint64 atom_data_size) {
  if (atom_data_size < kFullBoxHeaderAndFlagSize) {
    DLOG(WARNING) << base::StringPrintf(
        "esds box should at least be %d bytes but now it is %" PRId64 " bytes",
        kFullBoxHeaderAndFlagSize, atom_data_size);
    return false;
  }

  uint64 esds_offset = atom_offset_ + kFullBoxHeaderAndFlagSize;
  uint64 esds_size = atom_data_size - kFullBoxHeaderAndFlagSize;

  if (esds_size == 0) {
    return false;
  }
  // we'll need to download entire esds, allocate buffer for it
  std::vector<uint8> esds_storage(esds_size);
  uint8* esds = &esds_storage[0];
  // download esds
  int bytes_read = reader_->BlockingRead(esds_offset, esds_size, esds);
  if (bytes_read < esds_size) {
    DLOG(WARNING) << "failed to download esds";
    return false;
  }
  mp4::ESDescriptor es_descriptor;
  std::vector<uint8> data(esds, esds + esds_size);
  if (es_descriptor.Parse(data)) {
    const std::vector<uint8>& dsi = es_descriptor.decoder_specific_info();
    if (dsi.size() >= 2) {
      ParseAudioSpecificConfig(dsi[0], dsi[1]);
      atom_offset_ += atom_data_size;
      return true;
    }
    DLOG(WARNING) << "esds audio specific config shorter than 2 bytes";
  } else {
    DLOG(WARNING) << "error in parse esds box";
  }

  return false;
}

bool ShellMP4Parser::ParseMP4_hdlr(uint64 atom_data_size, uint8* hdlr) {
  // ensure we're downloading enough of the hdlr to parse
  DCHECK_LE(kDesiredBytes_hdlr + 16, kAtomDownload);
  // sanity-check for minimum size
  if (atom_data_size < kDesiredBytes_hdlr) {
    DLOG(WARNING) << base::StringPrintf("bad size %" PRId64 " on hdlr",
                                        atom_data_size);
    return false;
  }
  // last 4 bytes of the 12 we need are an ascii code for the trak type, we
  // want 'vide' for video or 'soun' for audio. ignore the rest.
  uint32 hdlr_subtype = endian_util::load_uint32_big_endian(hdlr + 8);
  // update state flags
  current_trak_is_video_ = (hdlr_subtype == kVideoSubtype_hdlr_vide);
  current_trak_is_audio_ = (hdlr_subtype == kAudioSubtype_hdlr_soun);
  // save a time scale if pending
  if (current_trak_time_scale_ > 0 && current_trak_is_video_) {
    video_time_scale_hz_ = current_trak_time_scale_;
    current_trak_time_scale_ = 0;
    video_track_duration_ = current_trak_duration_;
    one_video_tick_ =
        base::TimeDelta::FromMicroseconds(1000000 / video_time_scale_hz_);
  }
  if (current_trak_time_scale_ > 0 && current_trak_is_audio_) {
    audio_time_scale_hz_ = current_trak_time_scale_;
    current_trak_time_scale_ = 0;
    audio_track_duration_ = current_trak_duration_;
  }
  // skip rest of atom
  atom_offset_ += atom_data_size;
  return true;
}

bool ShellMP4Parser::ParseMP4_mdhd(uint64 atom_data_size, uint8* mdhd) {
  DCHECK_LE(kDesiredBytes_mdhd + 16, kAtomDownload);
  if (atom_data_size < kDesiredBytes_mdhd) {
    DLOG(WARNING) << base::StringPrintf("bad size %" PRId64 " on mdhd",
                                        atom_data_size);
    return false;
  }
  uint32 time_scale = endian_util::load_uint32_big_endian(mdhd + 12);
  if (time_scale == 0) {
    DLOG(WARNING) << "got 0 time scale for mvhd";
    return false;
  }
  // double-check track duration, it may be different from the movie duration
  uint32 track_duration_ticks = endian_util::load_uint32_big_endian(mdhd + 16);
  base::TimeDelta track_duration =
      TicksToTime(track_duration_ticks, time_scale);
  if (track_duration > duration_) {
    DLOG(WARNING) << base::StringPrintf("mdhd has longer duration: %" PRId64
                                        " ms than old value: %" PRId64 " ms.",
                                        track_duration.InMicroseconds(),
                                        duration_.InMicroseconds());
    duration_ = track_duration;
  }
  if (current_trak_is_video_) {
    video_time_scale_hz_ = time_scale;
    current_trak_time_scale_ = 0;
    video_track_duration_ = track_duration;
    one_video_tick_ =
        base::TimeDelta::FromMicroseconds(1000000 / video_time_scale_hz_);
  } else if (current_trak_is_audio_) {
    audio_time_scale_hz_ = time_scale;
    current_trak_time_scale_ = 0;
    audio_track_duration_ = track_duration;
  } else {
    // it's possible we will encounter the mdhd before we encounter the hdlr,
    // in that event we save the time scale value until we know.
    current_trak_time_scale_ = time_scale;
    current_trak_duration_ = track_duration;
  }
  atom_offset_ += atom_data_size;
  return true;
}

bool ShellMP4Parser::ParseMP4_mp4a(uint64 atom_data_size, uint8* mp4a) {
  DCHECK_LE(kDesiredBytes_mp4a + 16, kAtomDownload);
  // we only need the first two bytes of the header, which details the version
  // number of this atom, which tells us the size of the rest of the header,
  // telling us how much we should skip to get to the extension contents.
  if (atom_data_size < kDesiredBytes_mp4a) {
    DLOG(WARNING) << base::StringPrintf("bad size %" PRId64 " on mp4a",
                                        atom_data_size);
    return false;
  }
  uint16 mp4a_version = endian_util::load_uint16_big_endian(mp4a);
  switch (mp4a_version) {
    case 0:
      atom_offset_ += kTotalSize_mp4a_v0;
      return true;

    case 1:
      atom_offset_ += kTotalSize_mp4a_v1;
      return true;

    case 2:
      atom_offset_ += kTotalSize_mp4a_v2;
      return true;

    default:
      // unknown mp4a atom version, parse failure
      DLOG(ERROR) << base::StringPrintf("parsed bad mp4a version %d",
                                        mp4a_version);
      return false;
  }
}

// partial layout of mvhd header is:
// offset | name              | size in bytes
// -------+-------------------+---------------
// 0      | version           | 1 (ignored)
// 1      | flags             | 3 (ignored)
// 4      | creation time     | 4 (ignored)
// 8      | modification time | 4 (ignored)
// 12     | time scale        | 4
// 16     | duration:         | 4
//
bool ShellMP4Parser::ParseMP4_mvhd(uint64 atom_data_size, uint8* mvhd) {
  DCHECK_LE(kDesiredBytes_mvhd + 16, kAtomDownload);
  // it should be at least long enough for us to extract the parts we want
  if (atom_data_size < kDesiredBytes_mvhd) {
    DLOG(WARNING) << base::StringPrintf("bad size %" PRId64 " on mvhd",
                                        atom_data_size);
    return false;
  }
  uint32 time_scale_hz = endian_util::load_uint32_big_endian(mvhd + 12);
  if (time_scale_hz == 0) {
    DLOG(WARNING) << "got 0 time scale for mvhd";
    return false;
  }
  // duration is in units of the time scale we just extracted
  uint64 duration_ticks = endian_util::load_uint32_big_endian(mvhd + 16);
  // calculate actual duration from that and the time scale
  duration_ = TicksToTime(duration_ticks, time_scale_hz);
  // advance read position
  atom_offset_ += atom_data_size;
  return true;
}

base::TimeDelta ShellMP4Parser::TicksToTime(uint64 ticks,
                                            uint32 time_scale_hz) {
  DCHECK_NE(time_scale_hz, 0);

  if (time_scale_hz == 0) {
    return base::TimeDelta::FromSeconds(0);
  }
  return base::TimeDelta::FromMicroseconds((ticks * 1000000ULL) /
                                           time_scale_hz);
}

uint64 ShellMP4Parser::TimeToTicks(base::TimeDelta time, uint32 time_scale_hz) {
  DCHECK_NE(time_scale_hz, 0);

  if (time_scale_hz == 0) {
    return 0;
  }
  return (time.InMicroseconds() * time_scale_hz) / 1000000ULL;
}

}  // namespace media
}  // namespace cobalt
