/**********
This library is free software; you can redistribute it and/or modify it under
the terms of the GNU Lesser General Public License as published by the
Free Software Foundation; either version 3 of the License, or (at your
option) any later version. (See <http://www.gnu.org/copyleft/lesser.html>.)

This library is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for
more details.

You should have received a copy of the GNU Lesser General Public License
along with this library; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
**********/
// "liveMedia"
// Copyright (c) 1996-2020 Live Networks, Inc.  All rights reserved.
// EBML numbers (ids and sizes)
// Implementation

#include "EBMLNumber.hh"

EBMLNumber::EBMLNumber(Boolean stripLeading1)
    : stripLeading1(stripLeading1), len(0) {
}

EBMLNumber::~EBMLNumber() {
}

char* EBMLNumber::hexString() const {
  static char printBuf[2*EBML_NUMBER_MAX_LEN + 1];
  
  char* to = printBuf;
  for (unsigned i = 0; i < len; ++i) {
    sprintf(to, "%02X", data[i]);
    to += 2;
  }

  return printBuf;
}

u_int64_t EBMLNumber::val() const {
  u_int64_t result = 0;

  for (unsigned i = 0; i < len; ++i) {
    result = result*256 + data[i];
  }

  return result;
}

EBMLId::EBMLId()
  : EBMLNumber(False) {
}

EBMLId::~EBMLId() {
}

char const* EBMLId::stringName() const {
  switch (val()) {
    case MATROSKA_ID_EBML: { return "EBML"; }
    case MATROSKA_ID_VOID: { return "Void"; }
    case MATROSKA_ID_CRC_32: { return "CRC-32"; }
    case MATROSKA_ID_SEGMENT: { return "Segment"; }
    case MATROSKA_ID_SEEK_HEAD: { return "Seek Head"; }
    case MATROSKA_ID_SEEK: { return "Seek"; }
    case MATROSKA_ID_SEEK_ID: { return "Seek ID"; }
    case MATROSKA_ID_SEEK_POSITION: { return "Seek Position"; }
    case MATROSKA_ID_INFO: { return "Segment Info"; }
    case MATROSKA_ID_SEGMENT_UID: { return "Segment UID"; }
    case MATROSKA_ID_DURATION: { return "Segment Duration"; }
    case MATROSKA_ID_TIMECODE_SCALE: { return "Timecode Scale"; }
    case MATROSKA_ID_DATE_UTC: { return "Date (UTC)"; }
    case MATROSKA_ID_TITLE: { return "Title"; }
    case MATROSKA_ID_MUXING_APP: { return "Muxing App"; }
    case MATROSKA_ID_WRITING_APP: { return "Writing App"; }
    case MATROSKA_ID_CLUSTER: { return "Cluster"; }
    case MATROSKA_ID_TIMECODE: { return "TimeCode"; }
    case MATROSKA_ID_POSITION: { return "Position"; }
    case MATROSKA_ID_PREV_SIZE: { return "Prev. Size"; }
    case MATROSKA_ID_SIMPLEBLOCK: { return "SimpleBlock"; }
    case MATROSKA_ID_BLOCK_GROUP: { return "Block Group"; }
    case MATROSKA_ID_BLOCK: { return "Block"; }
    case MATROSKA_ID_BLOCK_DURATION: { return "Block Duration"; }
    case MATROSKA_ID_REFERENCE_BLOCK: { return "Reference Block"; }
    case MATROSKA_ID_TRACKS: { return "Tracks"; }
    case MATROSKA_ID_TRACK_ENTRY: { return "Track Entry"; }
    case MATROSKA_ID_TRACK_NUMBER: { return "Track Number"; }
    case MATROSKA_ID_TRACK_UID: { return "Track UID"; }
    case MATROSKA_ID_TRACK_TYPE: { return "Track Type"; }
    case MATROSKA_ID_FLAG_ENABLED: { return "Flag Enabled"; }
    case MATROSKA_ID_FLAG_DEFAULT: { return "Flag Default"; }
    case MATROSKA_ID_FLAG_FORCED: { return "Flag Forced"; }
    case MATROSKA_ID_FLAG_LACING: { return "Flag Lacing"; }
    case MATROSKA_ID_MIN_CACHE: { return "Min Cache"; }
    case MATROSKA_ID_DEFAULT_DURATION: { return "Default Duration"; }
    case MATROSKA_ID_TRACK_TIMECODE_SCALE: { return "Track Timecode Scale"; }
    case MATROSKA_ID_MAX_BLOCK_ADDITION_ID: { return "Max Block Addition ID"; }
    case MATROSKA_ID_NAME: { return "Name"; }
    case MATROSKA_ID_LANGUAGE: { return "Language"; }
    case MATROSKA_ID_CODEC: { return "Codec ID"; }
    case MATROSKA_ID_CODEC_PRIVATE: { return "Codec Private"; }
    case MATROSKA_ID_CODEC_NAME: { return "Codec Name"; }
    case MATROSKA_ID_CODEC_DECODE_ALL: { return "Codec Decode All"; }
    case MATROSKA_ID_VIDEO: { return "Video Settings"; }
    case MATROSKA_ID_FLAG_INTERLACED: { return "Flag Interlaced"; }
    case MATROSKA_ID_PIXEL_WIDTH: { return "Pixel Width"; }
    case MATROSKA_ID_PIXEL_HEIGHT: { return "Pixel Height"; }
    case MATROSKA_ID_DISPLAY_WIDTH: { return "Display Width"; }
    case MATROSKA_ID_DISPLAY_HEIGHT: { return "Display Height"; }
    case MATROSKA_ID_DISPLAY_UNIT: { return "Display Unit"; }
    case MATROSKA_ID_AUDIO: { return "Audio Settings"; }
    case MATROSKA_ID_SAMPLING_FREQUENCY: { return "Sampling Frequency"; }
    case MATROSKA_ID_OUTPUT_SAMPLING_FREQUENCY: { return "Output Sampling Frequency"; }
    case MATROSKA_ID_CHANNELS: { return "Channels"; }
    case MATROSKA_ID_BIT_DEPTH: { return "Bit Depth"; }
    case MATROSKA_ID_CONTENT_ENCODINGS: { return "Content Encodings"; }
    case MATROSKA_ID_CONTENT_ENCODING: { return "Content Encoding"; }
    case MATROSKA_ID_CONTENT_COMPRESSION: { return "Content Compression"; }
    case MATROSKA_ID_CONTENT_COMP_ALGO: { return "Content Compression Algorithm"; }
    case MATROSKA_ID_CONTENT_COMP_SETTINGS: { return "Content Compression Settings"; }
    case MATROSKA_ID_CONTENT_ENCRYPTION: { return "Content Encryption"; }
    case MATROSKA_ID_ATTACHMENTS: { return "Attachments"; }
    case MATROSKA_ID_ATTACHED_FILE: { return "Attached File"; }
    case MATROSKA_ID_FILE_DESCRIPTION: { return "File Description"; }
    case MATROSKA_ID_FILE_NAME: { return "File Name"; }
    case MATROSKA_ID_FILE_MIME_TYPE: { return "File MIME Type"; }
    case MATROSKA_ID_FILE_DATA: { return "File Data"; }
    case MATROSKA_ID_FILE_UID: { return "File UID"; }
    case MATROSKA_ID_CUES: { return "Cues"; }
    case MATROSKA_ID_CUE_POINT: { return "Cue Point"; }
    case MATROSKA_ID_CUE_TIME: { return "Cue Time"; }
    case MATROSKA_ID_CUE_TRACK_POSITIONS: { return "Cue Track Positions"; }
    case MATROSKA_ID_CUE_TRACK: { return "Cue Track"; }
    case MATROSKA_ID_CUE_CLUSTER_POSITION: { return "Cue Cluster Position"; }
    case MATROSKA_ID_CUE_BLOCK_NUMBER: { return "Cue Block Number"; }
    case MATROSKA_ID_TAGS: { return "Tags"; }
    case MATROSKA_ID_SEEK_PRE_ROLL: { return "SeekPreRoll"; }
    case MATROSKA_ID_CODEC_DELAY: { return "CodecDelay"; }
    case MATROSKA_ID_DISCARD_PADDING: { return "DiscardPadding"; }
    default: { return "*****unknown*****"; }
  }
}

EBMLDataSize::EBMLDataSize()
  : EBMLNumber(True) {
}

EBMLDataSize::~EBMLDataSize() {
}
