// Copyright 2015 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
//
// This file contains an implementation of a VP8 raw stream parser,
// as defined in RFC 6386.

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

#include "base/logging.h"
#include "starboard/memory.h"

namespace cobalt {
namespace media {

#define ERROR_RETURN(what)                           \
  do {                                               \
    DVLOG(1) << "Error while trying to read " #what; \
    return false;                                    \
  } while (0)

#define BD_READ_BOOL_OR_RETURN(out)            \
  do {                                         \
    if (!bd_.ReadBool(out)) ERROR_RETURN(out); \
  } while (0)

#define BD_READ_BOOL_WITH_PROB_OR_RETURN(out, prob)  \
  do {                                               \
    if (!bd_.ReadBool(out, prob)) ERROR_RETURN(out); \
  } while (0)

#define BD_READ_UNSIGNED_OR_RETURN(num_bits, out)             \
  do {                                                        \
    int _out;                                                 \
    if (!bd_.ReadLiteral(num_bits, &_out)) ERROR_RETURN(out); \
    *out = _out;                                              \
  } while (0)

#define BD_READ_SIGNED_OR_RETURN(num_bits, out)                       \
  do {                                                                \
    int _out;                                                         \
    if (!bd_.ReadLiteralWithSign(num_bits, &_out)) ERROR_RETURN(out); \
    *out = _out;                                                      \
  } while (0)

Vp8FrameHeader::Vp8FrameHeader() { SbMemorySet(this, 0, sizeof(*this)); }

Vp8Parser::Vp8Parser() : stream_(NULL), bytes_left_(0) {}

Vp8Parser::~Vp8Parser() {}

bool Vp8Parser::ParseFrame(const uint8_t* ptr, size_t frame_size,
                           Vp8FrameHeader* fhdr) {
  stream_ = ptr;
  bytes_left_ = frame_size;

  SbMemorySet(fhdr, 0, sizeof(*fhdr));
  fhdr->data = stream_;
  fhdr->frame_size = bytes_left_;

  if (!ParseFrameTag(fhdr)) return false;

  fhdr->first_part_offset = stream_ - fhdr->data;

  if (!ParseFrameHeader(fhdr)) return false;

  if (!ParsePartitions(fhdr)) return false;

  DVLOG(4) << "Frame parsed, start: " << static_cast<const void*>(ptr)
           << ", size: " << frame_size
           << ", offsets: to first_part=" << fhdr->first_part_offset
           << ", to macroblock data (in bits)=" << fhdr->macroblock_bit_offset;

  return true;
}

static inline uint32_t GetBitsAt(uint32_t data, size_t shift, size_t num_bits) {
  return ((data >> shift) & ((1 << num_bits) - 1));
}

bool Vp8Parser::ParseFrameTag(Vp8FrameHeader* fhdr) {
  const size_t kFrameTagSize = 3;
  if (bytes_left_ < kFrameTagSize) return false;

  uint32_t frame_tag = (stream_[2] << 16) | (stream_[1] << 8) | stream_[0];
  fhdr->key_frame =
      static_cast<Vp8FrameHeader::FrameType>(GetBitsAt(frame_tag, 0, 1));
  fhdr->version = GetBitsAt(frame_tag, 1, 2);
  fhdr->is_experimental = !!GetBitsAt(frame_tag, 3, 1);
  fhdr->show_frame = !!GetBitsAt(frame_tag, 4, 1);
  fhdr->first_part_size = GetBitsAt(frame_tag, 5, 19);

  stream_ += kFrameTagSize;
  bytes_left_ -= kFrameTagSize;

  if (fhdr->IsKeyframe()) {
    const size_t kKeyframeTagSize = 7;
    if (bytes_left_ < kKeyframeTagSize) return false;

    static const uint8_t kVp8StartCode[] = {0x9d, 0x01, 0x2a};
    if (SbMemoryCompare(stream_, kVp8StartCode, sizeof(kVp8StartCode)) != 0)
      return false;

    stream_ += sizeof(kVp8StartCode);
    bytes_left_ -= sizeof(kVp8StartCode);

    uint16_t data = (stream_[1] << 8) | stream_[0];
    fhdr->width = data & 0x3fff;
    fhdr->horizontal_scale = data >> 14;

    data = (stream_[3] << 8) | stream_[2];
    fhdr->height = data & 0x3fff;
    fhdr->vertical_scale = data >> 14;

    stream_ += 4;
    bytes_left_ -= 4;
  }

  return true;
}

bool Vp8Parser::ParseFrameHeader(Vp8FrameHeader* fhdr) {
  if (!bd_.Initialize(stream_, bytes_left_)) return false;

  bool keyframe = fhdr->IsKeyframe();
  if (keyframe) {
    unsigned int data;
    BD_READ_UNSIGNED_OR_RETURN(1, &data);  // color_space
    BD_READ_UNSIGNED_OR_RETURN(1, &data);  // clamping_type
  }

  if (!ParseSegmentationHeader(keyframe)) return false;

  fhdr->segmentation_hdr = curr_segmentation_hdr_;

  if (!ParseLoopFilterHeader(keyframe)) return false;

  fhdr->loopfilter_hdr = curr_loopfilter_hdr_;

  int log2_nbr_of_dct_partitions;
  BD_READ_UNSIGNED_OR_RETURN(2, &log2_nbr_of_dct_partitions);
  fhdr->num_of_dct_partitions = static_cast<size_t>(1)
                                << log2_nbr_of_dct_partitions;

  if (!ParseQuantizationHeader(&fhdr->quantization_hdr)) return false;

  if (keyframe) {
    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_entropy_probs);
  } else {
    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_golden_frame);
    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_alternate_frame);

    int refresh_mode;
    if (!fhdr->refresh_golden_frame) {
      BD_READ_UNSIGNED_OR_RETURN(2, &refresh_mode);
      fhdr->copy_buffer_to_golden =
          static_cast<Vp8FrameHeader::GoldenRefreshMode>(refresh_mode);
    }

    if (!fhdr->refresh_alternate_frame) {
      BD_READ_UNSIGNED_OR_RETURN(2, &refresh_mode);
      fhdr->copy_buffer_to_alternate =
          static_cast<Vp8FrameHeader::AltRefreshMode>(refresh_mode);
    }

    BD_READ_UNSIGNED_OR_RETURN(1, &fhdr->sign_bias_golden);
    BD_READ_UNSIGNED_OR_RETURN(1, &fhdr->sign_bias_alternate);
    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_entropy_probs);
    BD_READ_BOOL_OR_RETURN(&fhdr->refresh_last);
  }

  if (keyframe) ResetProbs();

  fhdr->entropy_hdr = curr_entropy_hdr_;

  if (!ParseTokenProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
    return false;

  BD_READ_BOOL_OR_RETURN(&fhdr->mb_no_skip_coeff);
  if (fhdr->mb_no_skip_coeff)
    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_skip_false);

  if (!keyframe) {
    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_intra);
    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_last);
    BD_READ_UNSIGNED_OR_RETURN(8, &fhdr->prob_gf);
  }

  if (!ParseIntraProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs,
                       keyframe))
    return false;

  if (!keyframe) {
    if (!ParseMVProbs(&fhdr->entropy_hdr, fhdr->refresh_entropy_probs))
      return false;
  }

  fhdr->macroblock_bit_offset = bd_.BitOffset();
  fhdr->bool_dec_range = bd_.GetRange();
  fhdr->bool_dec_value = bd_.GetBottom();
  fhdr->bool_dec_count = 7 - (bd_.BitOffset() + 7) % 8;

  return true;
}

bool Vp8Parser::ParseSegmentationHeader(bool keyframe) {
  Vp8SegmentationHeader* shdr = &curr_segmentation_hdr_;

  if (keyframe) SbMemorySet(shdr, 0, sizeof(*shdr));

  BD_READ_BOOL_OR_RETURN(&shdr->segmentation_enabled);
  if (!shdr->segmentation_enabled) return true;

  BD_READ_BOOL_OR_RETURN(&shdr->update_mb_segmentation_map);
  BD_READ_BOOL_OR_RETURN(&shdr->update_segment_feature_data);
  if (shdr->update_segment_feature_data) {
    int mode;
    BD_READ_UNSIGNED_OR_RETURN(1, &mode);
    shdr->segment_feature_mode =
        static_cast<Vp8SegmentationHeader::SegmentFeatureMode>(mode);

    for (size_t i = 0; i < kMaxMBSegments; ++i) {
      bool quantizer_update;
      BD_READ_BOOL_OR_RETURN(&quantizer_update);
      if (quantizer_update)
        BD_READ_SIGNED_OR_RETURN(7, &shdr->quantizer_update_value[i]);
      else
        shdr->quantizer_update_value[i] = 0;
    }

    for (size_t i = 0; i < kMaxMBSegments; ++i) {
      bool loop_filter_update;
      BD_READ_BOOL_OR_RETURN(&loop_filter_update);
      if (loop_filter_update)
        BD_READ_SIGNED_OR_RETURN(6, &shdr->lf_update_value[i]);
      else
        shdr->lf_update_value[i] = 0;
    }
  }

  if (shdr->update_mb_segmentation_map) {
    for (size_t i = 0; i < kNumMBFeatureTreeProbs; ++i) {
      bool segment_prob_update;
      BD_READ_BOOL_OR_RETURN(&segment_prob_update);
      if (segment_prob_update)
        BD_READ_UNSIGNED_OR_RETURN(8, &shdr->segment_prob[i]);
      else
        shdr->segment_prob[i] = Vp8SegmentationHeader::kDefaultSegmentProb;
    }
  }

  return true;
}

bool Vp8Parser::ParseLoopFilterHeader(bool keyframe) {
  Vp8LoopFilterHeader* lfhdr = &curr_loopfilter_hdr_;

  if (keyframe) SbMemorySet(lfhdr, 0, sizeof(*lfhdr));

  int type;
  BD_READ_UNSIGNED_OR_RETURN(1, &type);
  lfhdr->type = static_cast<Vp8LoopFilterHeader::Type>(type);
  BD_READ_UNSIGNED_OR_RETURN(6, &lfhdr->level);
  BD_READ_UNSIGNED_OR_RETURN(3, &lfhdr->sharpness_level);
  BD_READ_BOOL_OR_RETURN(&lfhdr->loop_filter_adj_enable);

  if (lfhdr->loop_filter_adj_enable) {
    BD_READ_BOOL_OR_RETURN(&lfhdr->mode_ref_lf_delta_update);
    if (lfhdr->mode_ref_lf_delta_update) {
      for (size_t i = 0; i < kNumBlockContexts; ++i) {
        bool ref_frame_delta_update_flag;
        BD_READ_BOOL_OR_RETURN(&ref_frame_delta_update_flag);
        if (ref_frame_delta_update_flag)
          BD_READ_SIGNED_OR_RETURN(6, &lfhdr->ref_frame_delta[i]);
      }

      for (size_t i = 0; i < kNumBlockContexts; ++i) {
        bool mb_mode_delta_update_flag;
        BD_READ_BOOL_OR_RETURN(&mb_mode_delta_update_flag);
        if (mb_mode_delta_update_flag)
          BD_READ_SIGNED_OR_RETURN(6, &lfhdr->mb_mode_delta[i]);
      }
    }
  }

  return true;
}

bool Vp8Parser::ParseQuantizationHeader(Vp8QuantizationHeader* qhdr) {
  // If any of the delta values is not present, the delta should be zero.
  SbMemorySet(qhdr, 0, sizeof(*qhdr));

  BD_READ_UNSIGNED_OR_RETURN(7, &qhdr->y_ac_qi);

  bool delta_present;

  BD_READ_BOOL_OR_RETURN(&delta_present);
  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->y_dc_delta);

  BD_READ_BOOL_OR_RETURN(&delta_present);
  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_dc_delta);

  BD_READ_BOOL_OR_RETURN(&delta_present);
  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->y2_ac_delta);

  BD_READ_BOOL_OR_RETURN(&delta_present);
  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_dc_delta);

  BD_READ_BOOL_OR_RETURN(&delta_present);
  if (delta_present) BD_READ_SIGNED_OR_RETURN(4, &qhdr->uv_ac_delta);

  return true;
}

// See spec for details on these values.
const uint8_t kCoeffUpdateProbs
    [kNumBlockTypes][kNumCoeffBands][kNumPrevCoeffContexts][kNumEntropyNodes] =
        {
            {
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {176, 246, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {223, 241, 252, 255, 255, 255, 255, 255, 255, 255, 255},
                    {249, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 244, 252, 255, 255, 255, 255, 255, 255, 255, 255},
                    {234, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 246, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {239, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {251, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {251, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 254, 253, 255, 254, 255, 255, 255, 255, 255, 255},
                    {250, 255, 254, 255, 254, 255, 255, 255, 255, 255, 255},
                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
            },
            {
                {
                    {217, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {225, 252, 241, 253, 255, 255, 254, 255, 255, 255, 255},
                    {234, 250, 241, 250, 253, 255, 253, 254, 255, 255, 255},
                },
                {
                    {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {223, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {238, 253, 254, 254, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 248, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {249, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 253, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {247, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {252, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {253, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
                    {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
            },
            {
                {
                    {186, 251, 250, 255, 255, 255, 255, 255, 255, 255, 255},
                    {234, 251, 244, 254, 255, 255, 255, 255, 255, 255, 255},
                    {251, 251, 243, 253, 254, 255, 254, 255, 255, 255, 255},
                },
                {
                    {255, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {236, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {251, 253, 253, 254, 254, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 254, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
            },
            {
                {
                    {248, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {250, 254, 252, 254, 255, 255, 255, 255, 255, 255, 255},
                    {248, 254, 249, 253, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
                    {246, 253, 253, 255, 255, 255, 255, 255, 255, 255, 255},
                    {252, 254, 251, 254, 254, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 254, 252, 255, 255, 255, 255, 255, 255, 255, 255},
                    {248, 254, 253, 255, 255, 255, 255, 255, 255, 255, 255},
                    {253, 255, 254, 254, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {245, 251, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {253, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 251, 253, 255, 255, 255, 255, 255, 255, 255, 255},
                    {252, 253, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 254, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 252, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {249, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 254, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 253, 255, 255, 255, 255, 255, 255, 255, 255},
                    {250, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
                {
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {254, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                    {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255},
                },
            },
};

const uint8_t kKeyframeYModeProbs[kNumYModeProbs] = {145, 156, 163, 128};
const uint8_t kKeyframeUVModeProbs[kNumUVModeProbs] = {142, 114, 183};

const uint8_t kDefaultYModeProbs[kNumYModeProbs] = {112, 86, 140, 37};
const uint8_t kDefaultUVModeProbs[kNumUVModeProbs] = {162, 101, 204};

const uint8_t kDefaultCoeffProbs
    [kNumBlockTypes][kNumCoeffBands][kNumPrevCoeffContexts][kNumEntropyNodes] =
        {
            {{
                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
             },
             {
                 {253, 136, 254, 255, 228, 219, 128, 128, 128, 128, 128},
                 {189, 129, 242, 255, 227, 213, 255, 219, 128, 128, 128},
                 {106, 126, 227, 252, 214, 209, 255, 255, 128, 128, 128},
             },
             {
                 {1, 98, 248, 255, 236, 226, 255, 255, 128, 128, 128},
                 {181, 133, 238, 254, 221, 234, 255, 154, 128, 128, 128},
                 {78, 134, 202, 247, 198, 180, 255, 219, 128, 128, 128},
             },
             {
                 {1, 185, 249, 255, 243, 255, 128, 128, 128, 128, 128},
                 {184, 150, 247, 255, 236, 224, 128, 128, 128, 128, 128},
                 {77, 110, 216, 255, 236, 230, 128, 128, 128, 128, 128},
             },
             {
                 {1, 101, 251, 255, 241, 255, 128, 128, 128, 128, 128},
                 {170, 139, 241, 252, 236, 209, 255, 255, 128, 128, 128},
                 {37, 116, 196, 243, 228, 255, 255, 255, 128, 128, 128},
             },
             {
                 {1, 204, 254, 255, 245, 255, 128, 128, 128, 128, 128},
                 {207, 160, 250, 255, 238, 128, 128, 128, 128, 128, 128},
                 {102, 103, 231, 255, 211, 171, 128, 128, 128, 128, 128},
             },
             {
                 {1, 152, 252, 255, 240, 255, 128, 128, 128, 128, 128},
                 {177, 135, 243, 255, 234, 225, 128, 128, 128, 128, 128},
                 {80, 129, 211, 255, 194, 224, 128, 128, 128, 128, 128},
             },
             {
                 {1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
                 {246, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
                 {255, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
             }},
            {{
                 {198, 35, 237, 223, 193, 187, 162, 160, 145, 155, 62},
                 {131, 45, 198, 221, 172, 176, 220, 157, 252, 221, 1},
                 {68, 47, 146, 208, 149, 167, 221, 162, 255, 223, 128},
             },
             {
                 {1, 149, 241, 255, 221, 224, 255, 255, 128, 128, 128},
                 {184, 141, 234, 253, 222, 220, 255, 199, 128, 128, 128},
                 {81, 99, 181, 242, 176, 190, 249, 202, 255, 255, 128},
             },
             {
                 {1, 129, 232, 253, 214, 197, 242, 196, 255, 255, 128},
                 {99, 121, 210, 250, 201, 198, 255, 202, 128, 128, 128},
                 {23, 91, 163, 242, 170, 187, 247, 210, 255, 255, 128},
             },
             {
                 {1, 200, 246, 255, 234, 255, 128, 128, 128, 128, 128},
                 {109, 178, 241, 255, 231, 245, 255, 255, 128, 128, 128},
                 {44, 130, 201, 253, 205, 192, 255, 255, 128, 128, 128},
             },
             {
                 {1, 132, 239, 251, 219, 209, 255, 165, 128, 128, 128},
                 {94, 136, 225, 251, 218, 190, 255, 255, 128, 128, 128},
                 {22, 100, 174, 245, 186, 161, 255, 199, 128, 128, 128},
             },
             {
                 {1, 182, 249, 255, 232, 235, 128, 128, 128, 128, 128},
                 {124, 143, 241, 255, 227, 234, 128, 128, 128, 128, 128},
                 {35, 77, 181, 251, 193, 211, 255, 205, 128, 128, 128},
             },
             {
                 {1, 157, 247, 255, 236, 231, 255, 255, 128, 128, 128},
                 {121, 141, 235, 255, 225, 227, 255, 255, 128, 128, 128},
                 {45, 99, 188, 251, 195, 217, 255, 224, 128, 128, 128},
             },
             {
                 {1, 1, 251, 255, 213, 255, 128, 128, 128, 128, 128},
                 {203, 1, 248, 255, 255, 128, 128, 128, 128, 128, 128},
                 {137, 1, 177, 255, 224, 255, 128, 128, 128, 128, 128},
             }},
            {{
                 {253, 9, 248, 251, 207, 208, 255, 192, 128, 128, 128},
                 {175, 13, 224, 243, 193, 185, 249, 198, 255, 255, 128},
                 {73, 17, 171, 221, 161, 179, 236, 167, 255, 234, 128},
             },
             {
                 {1, 95, 247, 253, 212, 183, 255, 255, 128, 128, 128},
                 {239, 90, 244, 250, 211, 209, 255, 255, 128, 128, 128},
                 {155, 77, 195, 248, 188, 195, 255, 255, 128, 128, 128},
             },
             {
                 {1, 24, 239, 251, 218, 219, 255, 205, 128, 128, 128},
                 {201, 51, 219, 255, 196, 186, 128, 128, 128, 128, 128},
                 {69, 46, 190, 239, 201, 218, 255, 228, 128, 128, 128},
             },
             {
                 {1, 191, 251, 255, 255, 128, 128, 128, 128, 128, 128},
                 {223, 165, 249, 255, 213, 255, 128, 128, 128, 128, 128},
                 {141, 124, 248, 255, 255, 128, 128, 128, 128, 128, 128},
             },
             {
                 {1, 16, 248, 255, 255, 128, 128, 128, 128, 128, 128},
                 {190, 36, 230, 255, 236, 255, 128, 128, 128, 128, 128},
                 {149, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
             },
             {
                 {1, 226, 255, 128, 128, 128, 128, 128, 128, 128, 128},
                 {247, 192, 255, 128, 128, 128, 128, 128, 128, 128, 128},
                 {240, 128, 255, 128, 128, 128, 128, 128, 128, 128, 128},
             },
             {
                 {1, 134, 252, 255, 255, 128, 128, 128, 128, 128, 128},
                 {213, 62, 250, 255, 255, 128, 128, 128, 128, 128, 128},
                 {55, 93, 255, 128, 128, 128, 128, 128, 128, 128, 128},
             },
             {
                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
                 {128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128},
             }},
            {
                {
                    {202, 24, 213, 235, 186, 191, 220, 160, 240, 175, 255},
                    {126, 38, 182, 232, 169, 184, 228, 174, 255, 187, 128},
                    {61, 46, 138, 219, 151, 178, 240, 170, 255, 216, 128},
                },
                {
                    {1, 112, 230, 250, 199, 191, 247, 159, 255, 255, 128},
                    {166, 109, 228, 252, 211, 215, 255, 174, 128, 128, 128},
                    {39, 77, 162, 232, 172, 180, 245, 178, 255, 255, 128},
                },
                {
                    {1, 52, 220, 246, 198, 199, 249, 220, 255, 255, 128},
                    {124, 74, 191, 243, 183, 193, 250, 221, 255, 255, 128},
                    {24, 71, 130, 219, 154, 170, 243, 182, 255, 255, 128},
                },
                {{1, 182, 225, 249, 219, 240, 255, 224, 128, 128, 128},
                 {149, 150, 226, 252, 216, 205, 255, 171, 128, 128, 128},
                 {28, 108, 170, 242, 183, 194, 254, 223, 255, 255, 128}},
                {
                    {1, 81, 230, 252, 204, 203, 255, 192, 128, 128, 128},
                    {123, 102, 209, 247, 188, 196, 255, 233, 128, 128, 128},
                    {20, 95, 153, 243, 164, 173, 255, 203, 128, 128, 128},
                },
                {
                    {1, 222, 248, 255, 216, 213, 128, 128, 128, 128, 128},
                    {168, 175, 246, 252, 235, 205, 255, 255, 128, 128, 128},
                    {47, 116, 215, 255, 211, 212, 255, 255, 128, 128, 128},
                },
                {
                    {1, 121, 236, 253, 212, 214, 255, 255, 128, 128, 128},
                    {141, 84, 213, 252, 201, 202, 255, 219, 128, 128, 128},
                    {42, 80, 160, 240, 162, 185, 255, 205, 128, 128, 128},
                },
                {
                    {1, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
                    {244, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
                    {238, 1, 255, 128, 128, 128, 128, 128, 128, 128, 128},
                },
            },
};

const uint8_t kMVUpdateProbs[kNumMVContexts][kNumMVProbs] = {
    {
        237, 246, 253, 253, 254, 254, 254, 254, 254, 254,
        254, 254, 254, 254, 250, 250, 252, 254, 254,
    },
    {
        231, 243, 245, 253, 254, 254, 254, 254, 254, 254,
        254, 254, 254, 254, 251, 251, 254, 254, 254,
    },
};

const uint8_t kDefaultMVProbs[kNumMVContexts][kNumMVProbs] = {
    {
        162, 128, 225, 146, 172, 147, 214, 39,  156, 128,
        129, 132, 75,  145, 178, 206, 239, 254, 254,
    },
    {
        164, 128, 204, 170, 119, 235, 140, 230, 228, 128,
        130, 130, 74,  148, 180, 203, 236, 254, 254,
    },
};

void Vp8Parser::ResetProbs() {
  static_assert(
      sizeof(curr_entropy_hdr_.coeff_probs) == sizeof(kDefaultCoeffProbs),
      "coeff_probs_arrays_must_be_of_correct_size");
  SbMemoryCopy(curr_entropy_hdr_.coeff_probs, kDefaultCoeffProbs,
               sizeof(curr_entropy_hdr_.coeff_probs));

  static_assert(sizeof(curr_entropy_hdr_.mv_probs) == sizeof(kDefaultMVProbs),
                "mv_probs_arrays_must_be_of_correct_size");
  SbMemoryCopy(curr_entropy_hdr_.mv_probs, kDefaultMVProbs,
               sizeof(curr_entropy_hdr_.mv_probs));

  static_assert(
      sizeof(curr_entropy_hdr_.y_mode_probs) == sizeof(kDefaultYModeProbs),
      "y_probs_arrays_must_be_of_correct_size");
  SbMemoryCopy(curr_entropy_hdr_.y_mode_probs, kDefaultYModeProbs,
               sizeof(curr_entropy_hdr_.y_mode_probs));

  static_assert(
      sizeof(curr_entropy_hdr_.uv_mode_probs) == sizeof(kDefaultUVModeProbs),
      "uv_probs_arrays_must_be_of_correct_size");
  SbMemoryCopy(curr_entropy_hdr_.uv_mode_probs, kDefaultUVModeProbs,
               sizeof(curr_entropy_hdr_.uv_mode_probs));
}

bool Vp8Parser::ParseTokenProbs(Vp8EntropyHeader* ehdr,
                                bool update_curr_probs) {
  for (size_t i = 0; i < kNumBlockTypes; ++i) {
    for (size_t j = 0; j < kNumCoeffBands; ++j) {
      for (size_t k = 0; k < kNumPrevCoeffContexts; ++k) {
        for (size_t l = 0; l < kNumEntropyNodes; ++l) {
          bool coeff_prob_update_flag;
          BD_READ_BOOL_WITH_PROB_OR_RETURN(&coeff_prob_update_flag,
                                           kCoeffUpdateProbs[i][j][k][l]);
          if (coeff_prob_update_flag)
            BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->coeff_probs[i][j][k][l]);
        }
      }
    }
  }

  if (update_curr_probs) {
    SbMemoryCopy(curr_entropy_hdr_.coeff_probs, ehdr->coeff_probs,
                 sizeof(curr_entropy_hdr_.coeff_probs));
  }

  return true;
}

bool Vp8Parser::ParseIntraProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs,
                                bool keyframe) {
  if (keyframe) {
    static_assert(sizeof(ehdr->y_mode_probs) == sizeof(kKeyframeYModeProbs),
                  "y_probs_arrays_must_be_of_correct_size");
    SbMemoryCopy(ehdr->y_mode_probs, kKeyframeYModeProbs,
                 sizeof(ehdr->y_mode_probs));

    static_assert(sizeof(ehdr->uv_mode_probs) == sizeof(kKeyframeUVModeProbs),
                  "uv_probs_arrays_must_be_of_correct_size");
    SbMemoryCopy(ehdr->uv_mode_probs, kKeyframeUVModeProbs,
                 sizeof(ehdr->uv_mode_probs));
  } else {
    bool intra_16x16_prob_update_flag;
    BD_READ_BOOL_OR_RETURN(&intra_16x16_prob_update_flag);
    if (intra_16x16_prob_update_flag) {
      for (size_t i = 0; i < kNumYModeProbs; ++i)
        BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->y_mode_probs[i]);

      if (update_curr_probs) {
        SbMemoryCopy(curr_entropy_hdr_.y_mode_probs, ehdr->y_mode_probs,
                     sizeof(curr_entropy_hdr_.y_mode_probs));
      }
    }

    bool intra_chroma_prob_update_flag;
    BD_READ_BOOL_OR_RETURN(&intra_chroma_prob_update_flag);
    if (intra_chroma_prob_update_flag) {
      for (size_t i = 0; i < kNumUVModeProbs; ++i)
        BD_READ_UNSIGNED_OR_RETURN(8, &ehdr->uv_mode_probs[i]);

      if (update_curr_probs) {
        SbMemoryCopy(curr_entropy_hdr_.uv_mode_probs, ehdr->uv_mode_probs,
                     sizeof(curr_entropy_hdr_.uv_mode_probs));
      }
    }
  }

  return true;
}

bool Vp8Parser::ParseMVProbs(Vp8EntropyHeader* ehdr, bool update_curr_probs) {
  for (size_t mv_ctx = 0; mv_ctx < kNumMVContexts; ++mv_ctx) {
    for (size_t p = 0; p < kNumMVProbs; ++p) {
      bool mv_prob_update_flag;
      BD_READ_BOOL_WITH_PROB_OR_RETURN(&mv_prob_update_flag,
                                       kMVUpdateProbs[mv_ctx][p]);
      if (mv_prob_update_flag) {
        uint8_t prob;
        BD_READ_UNSIGNED_OR_RETURN(7, &prob);
        ehdr->mv_probs[mv_ctx][p] = prob ? (prob << 1) : 1;
      }
    }
  }

  if (update_curr_probs) {
    SbMemoryCopy(curr_entropy_hdr_.mv_probs, ehdr->mv_probs,
                 sizeof(curr_entropy_hdr_.mv_probs));
  }

  return true;
}

bool Vp8Parser::ParsePartitions(Vp8FrameHeader* fhdr) {
  CHECK_GE(fhdr->num_of_dct_partitions, 1u);
  CHECK_LE(fhdr->num_of_dct_partitions, kMaxDCTPartitions);

  // DCT partitions start after the first partition and partition size values
  // that follow it. There are num_of_dct_partitions - 1 sizes stored in the
  // stream after the first partition, each 3 bytes long. The size of last
  // DCT partition is not stored in the stream, but is instead calculated by
  // taking the remainder of the frame size after the penultimate DCT partition.
  size_t first_dct_pos = fhdr->first_part_offset + fhdr->first_part_size +
                         (fhdr->num_of_dct_partitions - 1) * 3;

  // Make sure we have enough data for the first partition and partition sizes.
  if (fhdr->frame_size < first_dct_pos) return false;

  // Total size of all DCT partitions.
  size_t bytes_left = fhdr->frame_size - first_dct_pos;

  // Position ourselves at the beginning of partition size values.
  const uint8_t* ptr =
      fhdr->data + fhdr->first_part_offset + fhdr->first_part_size;

  // Read sizes from the stream (if present).
  for (size_t i = 0; i < fhdr->num_of_dct_partitions - 1; ++i) {
    fhdr->dct_partition_sizes[i] = (ptr[2] << 16) | (ptr[1] << 8) | ptr[0];

    // Make sure we have enough data in the stream for ith partition and
    // subtract its size from total.
    if (bytes_left < fhdr->dct_partition_sizes[i]) return false;

    bytes_left -= fhdr->dct_partition_sizes[i];

    // Move to the position of the next partition size value.
    ptr += 3;
  }

  // The remainder of the data belongs to the last DCT partition.
  fhdr->dct_partition_sizes[fhdr->num_of_dct_partitions - 1] = bytes_left;

  DVLOG(4) << "Control part size: " << fhdr->first_part_size;
  for (size_t i = 0; i < fhdr->num_of_dct_partitions; ++i)
    DVLOG(4) << "DCT part " << i << " size: " << fhdr->dct_partition_sizes[i];

  return true;
}

}  // namespace media
}  // namespace cobalt
