// Copyright 2016 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.

#include <ostream>

#include "services/media/framework_ffmpeg/ffmpeg_formatting.h"
extern "C" {
#include "third_party/ffmpeg/libavformat/avformat.h"
#include "third_party/ffmpeg/libavformat/internal.h"
#include "third_party/ffmpeg/libavutil/dict.h"
}

namespace mojo {
namespace media {

const char* safe(const char* s) {
  return s == nullptr ? "<nullptr>" : s;
}

std::ostream& operator<<(
    std::ostream& os,
    const struct AVCodecTag *const *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else if (*value == nullptr) {
      return os << "&<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "AVCodecID id: " << (*value)->id << std::endl;
  os << begl << "unsigned int tag: " << (*value)->tag << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVInputFormat *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "const char *name: " << value->name << std::endl;
  os << begl << "const char *long_name: " << value->long_name << std::endl;
  os << begl << "int flags: " << AVFMTFlags(value->flags);
  os << begl << "const char *extensions: " << safe(value->extensions)
      << std::endl;
  os << begl << "const AVCodecTag * const *codec_tag: " << value->codec_tag;
  os << begl << "const char *mime_type: " << safe(value->mime_type)
      << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVOutputFormat *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "const char *name: " << safe(value->name) << std::endl;
  os << begl << "const char *long_name: " << safe(value->long_name)
      << std::endl;
  os << begl << "const char *mime_type: " << safe(value->mime_type)
      << std::endl;
  os << begl << "const char *extensions: " << safe(value->extensions)
      << std::endl;
  os << begl << "AVCodecID audio_codec: " << value->audio_codec;
  os << begl << "AVCodecID video_codec: " << value->video_codec;
  os << begl << "AVCodecID subtitle_codec: " << value->subtitle_codec;
  os << begl << "int flags: " << AVFMTFlags(value->flags);
  os << begl << "const AVCodecTag * const *codec_tag: " << value->codec_tag;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVIOContext *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    return os << "TODO" << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, AVFMTCTXFlags value) {
  if (value.flags_ == 0) {
    return os << "<none>" << std::endl;
  }

  if (value.flags_ & AVFMTCTX_NOHEADER) {
    return os << "AVFMTCTX_NOHEADER" << std::endl;
  } else {
    return os << "<UNKNOWN AVFMTCTX_: " << value.flags_ << ">" << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, const AVRational *value) {
  if (value == nullptr) {
    return os << "<none>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (int index = 0; value->num != 0 || value->den != 0; ++value, ++index) {
    os << begl << "[" << index << "]: " << *value;
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const int *value) {
  if (value == nullptr) {
    return os << "<none>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (int index = 0; *value != 0; ++value, ++index) {
    os << begl << "[" << index << "]: " << *value << std::endl;
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const uint64_t *value) {
  if (value == nullptr) {
    return os << "<none>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (int index = 0; *value != 0; ++value, ++index) {
    os << begl << "[" << index << "]: " << *value << std::endl;
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVSampleFormat *value) {
  if (value == nullptr) {
    return os << "<none>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (int index = 0; int(*value) != 0; ++value, ++index) {
    os << begl << "[" << index << "]: " << *value;
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVCodec *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "const char *name: " << safe(value->name) << std::endl;
  os << begl << "const char *long_name: " << safe(value->long_name)
      << std::endl;
  os << begl << "AVMediaType type: " << value->type;
  os << begl << "AVCodecID id: " << value->id;
  os << begl << "int capabilities: " << value->capabilities << std::endl;
  os << begl << "AVRational *supported_framerates: "
      << value->supported_framerates;
  os << begl << "const int *supported_samplerates: "
      << value->supported_samplerates;
  os << begl << "const AVSampleFormat *sample_fmts: " << value->sample_fmts;
  os << begl << "const uint64_t *channel_layouts: " << value->channel_layouts;

  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVCodecContext *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "AVMediaType codec_type: " << value->codec_type;
  os << begl << "const struct AVCodec *codec: " << value->codec;
  os << begl << "AVCodecID codec_id: " << value->codec_id;
  os << begl << "int bit_rate: " << value->bit_rate << std::endl;
  os << begl << "int extradata_size: " << value->extradata_size << std::endl;
  os << begl << "int width: " << value->width << std::endl;
  os << begl << "int height: " << value->height << std::endl;
  os << begl << "int coded_width: " << value->coded_width << std::endl;
  os << begl << "int coded_height: " << value->coded_height << std::endl;
  os << begl << "int gop_size: " << value->gop_size << std::endl;
  os << begl << "int sample_rate: " << value->sample_rate << std::endl;
  os << begl << "int channels: " << value->channels << std::endl;
  os << begl << "AVSampleFormat sample_fmt: " << value->sample_fmt;
  os << begl << "int frame_size: " << value->frame_size << std::endl;
  os << begl << "int frame_number: " << value->frame_number << std::endl;
  os << begl << "int block_align: " << value->block_align << std::endl;
  os << begl << "int cutoff: " << value->cutoff << std::endl;
  os << begl << "uint64_t channel_layout: " << value->channel_layout
      << std::endl;
  os << begl << "uint64_t request_channel_layout: "
      << value->request_channel_layout << std::endl;
  os << begl << "AVAudioServiceType audio_service_type: "
      << value->audio_service_type << std::endl;
  os << begl << "AVSampleFormat request_sample_fmt: "
      << value->request_sample_fmt;
   os << begl << "int profile: " << value->profile << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVRational& value) {
  return os << value.num << "/" << value.den << std::endl;
}

std::ostream& operator<<(std::ostream& os, const AVStream *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "int index: " << value->index << std::endl;
  os << begl << "int id: " << value->id << std::endl;
  os << begl << "AVCodecContext *codec: " << value->codec;
  os << begl << "AVRational time_base: " << value->time_base;
  os << begl << "int64_t start_time: " << value->start_time << std::endl;
  os << begl << "int64_t duration: " << value->duration << std::endl;
  os << begl << "int64_t nb_frames: " << value->nb_frames << std::endl;
  os << begl << "int disposition: " << AV_DISPOSITIONFlags(value->disposition);
  os << begl << "AVDiscard discard: " << value->discard;
  os << begl << "AVRational sample_aspect_ratio: "
      << value->sample_aspect_ratio;
  os << begl << "AVDictionary *metadata: " << value->metadata;
  os << begl << "AVRational avg_frame_rate: " << value->avg_frame_rate;
  os << begl << "AVPacket attached_pic: " << &value->attached_pic;
  os << begl << "int nb_side_data: " << value->nb_side_data << std::endl;
  os << begl << "AVPacketSideData side_data: " <<
      AVPacketSideDataArray(value->side_data, value->nb_side_data);
  os << begl << "int event_flags: " << AVSTREAM_EVENTFlags(value->event_flags);
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVStreamArray& value) {
  if (value.items_ == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else if (value.count_ == 0) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (unsigned int i = 0; i < value.count_; i++) {
    os << begl << "[" << i << "] " << value.items_[i];
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, AVFMTFlags value) {
  if (value.flags_ == 0) {
    os << "<none>" << std::endl;
    return os;
  } else {
    os << std::endl;
  }

  os << indent;
  if (value.flags_ & AVFMT_FLAG_GENPTS) {
    os << begl << "AVFMT_FLAG_GENPTS" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_IGNIDX) {
    os << begl << "AVFMT_FLAG_IGNIDX" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_NONBLOCK) {
    os << begl << "AVFMT_FLAG_NONBLOCK" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_IGNDTS) {
    os << begl << "AVFMT_FLAG_IGNDTS" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_NOFILLIN) {
    os << begl << "AVFMT_FLAG_NOFILLIN" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_NOPARSE) {
    os << begl << "AVFMT_FLAG_NOPARSE" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_NOBUFFER) {
    os << begl << "AVFMT_FLAG_NOBUFFER" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_CUSTOM_IO) {
    os << begl << "AVFMT_FLAG_CUSTOM_IO" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_DISCARD_CORRUPT) {
    os << begl << "AVFMT_FLAG_DISCARD_CORRUPT" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_FLUSH_PACKETS) {
    os << begl << "AVFMT_FLAG_FLUSH_PACKETS" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_BITEXACT) {
    os << begl << "AVFMT_FLAG_BITEXACT" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_MP4A_LATM) {
    os << begl << "AVFMT_FLAG_MP4A_LATM" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_SORT_DTS) {
    os << begl << "AVFMT_FLAG_SORT_DTS" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_PRIV_OPT) {
    os << begl << "AVFMT_FLAG_PRIV_OPT" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_KEEP_SIDE_DATA) {
    os << begl << "AVFMT_FLAG_KEEP_SIDE_DATA" << std::endl;
  }
  if (value.flags_ & AVFMT_FLAG_FAST_SEEK) {
    os << begl << "AVFMT_FLAG_FAST_SEEK" << std::endl;
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, AV_DISPOSITIONFlags value) {
  if (value.flags_ == 0) {
    os << "<none>" << std::endl;
    return os;
  } else {
    os << std::endl;
  }

  os << indent;
  if (value.flags_ & AV_DISPOSITION_DEFAULT) {
    os << begl << "AV_DISPOSITION_DEFAULT  0x0001" << std::endl;
  }
  if (value.flags_ & AV_DISPOSITION_DUB) {
    os << begl << "AV_DISPOSITION_DUB      0x0002" << std::endl;
  }
  if (value.flags_ & AV_DISPOSITION_ORIGINAL) {
    os << begl << "AV_DISPOSITION_ORIGINAL 0x0004" << std::endl;
  }
  if (value.flags_ & AV_DISPOSITION_COMMENT) {
    os << begl << "AV_DISPOSITION_COMMENT  0x0008" << std::endl;
  }
  if (value.flags_ & AV_DISPOSITION_LYRICS) {
    os << begl << "AV_DISPOSITION_LYRICS   0x0010" << std::endl;
  }
  if (value.flags_ & AV_DISPOSITION_KARAOKE) {
    os << begl << "AV_DISPOSITION_KARAOKE  0x0020" << std::endl;
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVBufferRef *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "AVBuffer *buffer: "
      << (value->buffer == nullptr ? "<nullptr>" : "TODO") << std::endl;
  os << begl << "uint8_t *data: "
      << (value->data == nullptr ? "<nullptr>" : "<opaque>") << std::endl;
  os << begl << "int size: " << value->size << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVFrame *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "uint8_t *data[AV_NUM_DATA_POINTERS]: ";
  {
    os << indent;
    bool any = false;
    for (int i = 0; i < AV_NUM_DATA_POINTERS; i++) {
      if (value->data[i] != nullptr) {
        if (!any) {
          any = true;
          os << std::endl;
        }
        os << begl << "[" << i << "]: <opaque>" << std::endl;
      }
    }
    if (!any) {
      os << "<all nullptr>" << std::endl;
    }
    os << outdent;
  }

  os << begl << "int linesize[AV_NUM_DATA_POINTERS]: ";
  {
    os << indent;
    bool any = false;
    for (int i = 0; i < AV_NUM_DATA_POINTERS; i++) {
      if (value->linesize[i] != 0) {
        if (!any) {
          any = true;
          os << std::endl;
        }
        os << begl << "[" << i << "]: " << value->linesize[i] << std::endl;
      }
    }
    if (!any) {
      os << "<all zero>" << std::endl;
    }
    os << outdent;
  }

  os << begl << "uint8_t **extended_data: "
      << (value->extended_data == nullptr ? "<nullptr>" : "<opaque>")
      << std::endl;
  os << begl << "int width: " << value->width << std::endl;
  os << begl << "int height: " << value->height << std::endl;
  os << begl << "int nb_samples: " << value->nb_samples << std::endl;
  os << begl << "int format: " << value->format << std::endl;
  os << begl << "int key_frame: " << value->key_frame << std::endl;
  os << begl << "int64_t pts: " << value->pts << std::endl;
  os << begl << "int64_t pkt_pts: " << value->pkt_pts << std::endl;
  os << begl << "int64_t pkt_dts: " << value->pkt_dts << std::endl;
  os << begl << "int sample_rate: " << value->sample_rate << std::endl;
  os << begl << "AVBufferRef *buf[AV_NUM_DATA_POINTERS]: ";
  {
    os << indent;
    bool any = false;
    for (int i = 0; i < AV_NUM_DATA_POINTERS; i++) {
      if (value->buf[i] != nullptr) {
        if (!any) {
          any = true;
          os << std::endl;
        }
        os << begl << "[" << i << "]:" << value->buf[i];
      }
    }
    if (!any) {
      os << "<all nullptr>" << std::endl;
    }
    os << outdent;
  }
  os << begl << "int channels: " << value->channels << std::endl;
  os << begl << "int pkt_size: " << value->pkt_size << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVPacket *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "AVBufferRef *buf: " << value->buf;
  os << begl << "int64_t pts: " << value->pts << std::endl;
  os << begl << "int64_t dts: " << value->dts << std::endl;
  os << begl << "uint8_t *data: "
      << (value->data == nullptr ? "<nullptr>" : "<opaque>") << std::endl;
  os << begl << "int size: " << value->size << std::endl;
  os << begl << "int stream_index: " << value->stream_index << std::endl;
  os << begl << "int flags: " << value->flags << std::endl;
  os << begl << "AVPacketSideData *side_data: " << value->side_data;
  os << begl << "int side_data_elems: " << value->side_data_elems << std::endl;
  os << begl << "int duration: " << value->duration << std::endl;
  os << begl << "int64_t pos: " << value->pos << std::endl;
  os << begl << "int64_t convergence_duration: "
      << value->convergence_duration << std::endl;
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVPacketSideData *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    return os << "TODO" << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, const AVPacketSideDataArray& value) {
  if (value.items_ == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else if (value.count_ == 0) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (unsigned int i = 0; i < value.count_; i++) {
    os << begl << "[" << i << "] " << &value.items_[i];
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVProgram *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    return os << "TODO" << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, const AVProgramArray& value) {
  if (value.items_ == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else if (value.count_ == 0) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (unsigned int i = 0; i < value.count_; i++) {
    os << begl << "[" << i << "]" << value.items_[i];
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, const AVChapter *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    return os << "TODO" << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, const AVChapterArray& value) {
  if (value.items_ == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else if (value.count_ == 0) {
    return os << "<empty>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  for (unsigned int i = 0; i < value.count_; i++) {
    os << begl << "[" << i << "]" << value.items_[i];
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, AVCodecID value) {
  return os << avcodec_get_name(value) << " (" << static_cast<int>(value) << ")"
      << std::endl;
}

std::ostream& operator<<(std::ostream& os, const AVDictionary *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  }
  AVDictionaryEntry *entry =
      av_dict_get(value, "", nullptr, AV_DICT_IGNORE_SUFFIX);
  if (entry == nullptr) {
    return os << "<empty>" << std::endl;
  }
  os << std::endl;

  os << indent;
  while (entry != nullptr) {
    os << begl << safe(entry->key) << ": " << safe(entry->value) << std::endl;
    entry = av_dict_get(value, "", entry, AV_DICT_IGNORE_SUFFIX);
  }
  return os << outdent;
}

std::ostream& operator<<(std::ostream& os, AVFMT_EVENTFlags value) {
  if (value.flags_ == 0) {
    os << "<none>" << std::endl;
    return os;
  }

  if (value.flags_ & AVFMT_EVENT_FLAG_METADATA_UPDATED) {
    return os << "AVFMT_EVENT_FLAG_METADATA_UPDATED" << std::endl;
  } else {
    return os << "<UNKNOWN AVFMT_EVENT_FLAG_: " << value.flags_ << ">"
        << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, AVSTREAM_EVENTFlags value) {
  if (value.flags_ == 0) {
    os << "<none>" << std::endl;
    return os;
  }

  if (value.flags_ & AVSTREAM_EVENT_FLAG_METADATA_UPDATED) {
    return os << "AVSTREAM_EVENT_FLAG_METADATA_UPDATED" << std::endl;
  } else {
    return os << "<UNKNOWN AVSTREAM_EVENT_FLAG_: " << value.flags_ << ">"
        << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, AVFMT_AVOID_NEG_TSFlags value) {
  switch (value.flags_) {
    case AVFMT_AVOID_NEG_TS_AUTO:
      return os << "AVFMT_AVOID_NEG_TS_AUTO" << std::endl;
    case AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE:
      return os << "AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE" << std::endl;
    case AVFMT_AVOID_NEG_TS_MAKE_ZERO:
      return os << "AVFMT_AVOID_NEG_TS_MAKE_ZERO" << std::endl;
    default:
      return os << "<UNKNOWN AVFMT_AVOID_NEG_TS_: " << value.flags_ << ">"
          << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, AVMediaType value) {
  switch (value) {
    case AVMEDIA_TYPE_UNKNOWN:
      return os << "AVMEDIA_TYPE_UNKNOWN" << std::endl;
    case AVMEDIA_TYPE_VIDEO:
      return os << "AVMEDIA_TYPE_VIDEO" << std::endl;
    case AVMEDIA_TYPE_AUDIO:
      return os << "AVMEDIA_TYPE_AUDIO" << std::endl;
    case AVMEDIA_TYPE_DATA:
      return os << "AVMEDIA_TYPE_DATA" << std::endl;
    case AVMEDIA_TYPE_SUBTITLE:
      return os << "AVMEDIA_TYPE_SUBTITLE" << std::endl;
    case AVMEDIA_TYPE_ATTACHMENT:
      return os << "AVMEDIA_TYPE_ATTACHMENT" << std::endl;
    case AVMEDIA_TYPE_NB:
      return os << "AVMEDIA_TYPE_NB" << std::endl;
    default:
      return os << "<UNKNOWN AVMediaType: " << static_cast<int>(value) << ">"
          << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, AVSampleFormat value) {
  switch (value) {
    case AV_SAMPLE_FMT_NONE:
      return os << "AV_SAMPLE_FMT_NONE" << std::endl;
    case AV_SAMPLE_FMT_U8:
      return os << "AV_SAMPLE_FMT_U8" << std::endl;
    case AV_SAMPLE_FMT_S16:
      return os << "AV_SAMPLE_FMT_S16" << std::endl;
    case AV_SAMPLE_FMT_S32:
      return os << "AV_SAMPLE_FMT_S32" << std::endl;
    case AV_SAMPLE_FMT_FLT:
      return os << "AV_SAMPLE_FMT_FLT" << std::endl;
    case AV_SAMPLE_FMT_DBL:
      return os << "AV_SAMPLE_FMT_DBL" << std::endl;
    case AV_SAMPLE_FMT_U8P:
      return os << "AV_SAMPLE_FMT_U8P" << std::endl;
    case AV_SAMPLE_FMT_S16P:
      return os << "AV_SAMPLE_FMT_S16P" << std::endl;
    case AV_SAMPLE_FMT_S32P:
      return os << "AV_SAMPLE_FMT_S32P" << std::endl;
    case AV_SAMPLE_FMT_FLTP:
      return os << "AV_SAMPLE_FMT_FLTP" << std::endl;
    case AV_SAMPLE_FMT_DBLP:
      return os << "AV_SAMPLE_FMT_DBLP" << std::endl;
    case AV_SAMPLE_FMT_NB:
      return os << "AV_SAMPLE_FMT_NB" << std::endl;
    default:
      return os << "<UNKNOWN AVSampleFormat: " << static_cast<int>(value) << ">"
          << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, AVColorSpace value) {
  switch (value) {
    case AVCOL_SPC_RGB:
      return os << "AVCOL_SPC_RGB" << std::endl;
    case AVCOL_SPC_BT709:
      return os << "AVCOL_SPC_BT709" << std::endl;
    case AVCOL_SPC_UNSPECIFIED:
      return os << "AVCOL_SPC_UNSPECIFIED" << std::endl;
    case AVCOL_SPC_RESERVED:
      return os << "AVCOL_SPC_RESERVED" << std::endl;
    case AVCOL_SPC_FCC:
      return os << "AVCOL_SPC_FCC" << std::endl;
    case AVCOL_SPC_BT470BG:
      return os << "AVCOL_SPC_BT470BG" << std::endl;
    case AVCOL_SPC_SMPTE170M:
      return os << "AVCOL_SPC_SMPTE170M" << std::endl;
    case AVCOL_SPC_SMPTE240M:
      return os << "AVCOL_SPC_SMPTE240M" << std::endl;
    case AVCOL_SPC_YCOCG:
      return os << "AVCOL_SPC_YCOCG" << std::endl;
    case AVCOL_SPC_BT2020_NCL:
      return os << "AVCOL_SPC_BT2020_NCL" << std::endl;
    case AVCOL_SPC_BT2020_CL:
      return os << "AVCOL_SPC_BT2020_CL" << std::endl;
    case AVCOL_SPC_NB:
      return os << "AVCOL_SPC_NB" << std::endl;
    default:
      return os << "<UNKNOWN AVColorSpace: " << static_cast<int>(value) << ">"
          << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, enum AVDiscard value) {
  switch (value) {
    case AVDISCARD_NONE:
      return os << "AVDISCARD_NONE" << std::endl;
    case AVDISCARD_DEFAULT:
      return os << "AVDISCARD_DEFAULT" << std::endl;
    case AVDISCARD_NONREF:
      return os << "AVDISCARD_NONREF" << std::endl;
    case AVDISCARD_BIDIR:
      return os << "AVDISCARD_BIDIR" << std::endl;
    case AVDISCARD_NONINTRA:
      return os << "AVDISCARD_NONINTRA" << std::endl;
    case AVDISCARD_NONKEY:
      return os << "AVDISCARD_NONKEY" << std::endl;
    case AVDISCARD_ALL:
      return os << "AVDISCARD_ALL" << std::endl;
    default:
      return os << "<UNKNOWN AVDISCARD_: " << static_cast<int>(value) << ">"
          << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, AVDurationEstimationMethod value) {
  switch (value) {
    case AVFMT_DURATION_FROM_PTS:
      return os << "AVFMT_DURATION_FROM_PTS" << std::endl;
    case AVFMT_DURATION_FROM_STREAM:
      return os << "AVFMT_DURATION_FROM_STREAM" << std::endl;
    case AVFMT_DURATION_FROM_BITRATE:
      return os << "AVFMT_DURATION_FROM_BITRATE" << std::endl;
    default:
      return os << "<UNKNOWN AVDurationEstimationMethod: "
          << static_cast<int>(value) << ">" << std::endl;
  }
}

std::ostream& operator<<(std::ostream& os, const AVFormatContext *value) {
  if (value == nullptr) {
    return os << "<nullptr>" << std::endl;
  } else {
    os << std::endl;
  }

  os << indent;
  os << begl << "AVInputFormat *iformat: " << value->iformat;
  os << begl << "AVOutputFormat *oformat: " << value->oformat;
  os << begl << "AVIOContext *pb: " << value->pb;
  os << begl << "int ctx_flags: " << AVFMTCTXFlags(value->ctx_flags);
  os << begl << "unsigned int nb_streams: " << value->nb_streams << std::endl;
  os << begl << "AVStream **streams: "
      << AVStreamArray(value->streams, value->nb_streams);
  os << begl << "char filename[1024]: " << value->filename << std::endl;
  os << begl << "int64_t start_time: " << value->start_time << std::endl;
  os << begl << "int64_t duration: " << value->duration << std::endl;
  os << begl << "int64_t bit_rate: " << value->bit_rate << std::endl;
  os << begl << "unsigned int packet_size: " << value->packet_size << std::endl;
  os << begl << "int max_delay: " << value->max_delay << std::endl;
  os << begl << "int flags: " << AVFMTFlags(value->flags);
  os << begl << "int64_t probesize: " << value->probesize << std::endl;
  os << begl << "unsigned int nb_programs: " << value->nb_programs << std::endl;
  os << begl << "AVProgram **programs: "
      << AVProgramArray(value->programs, value->nb_programs);
  os << begl << "AVCodecID video_codec_id: " << value->video_codec_id;
  os << begl << "AVCodecID audio_codec_id: " << value->audio_codec_id;
  os << begl << "AVCodecID subtitle_codec_id: " << value->subtitle_codec_id;
  os << begl << "unsigned int max_index_size: "
      << value->max_index_size << std::endl;
  os << begl << "unsigned int max_picture_buffer: "
      << value->max_picture_buffer << std::endl;
  os << begl << "unsigned int nb_chapters: " << value->nb_chapters << std::endl;
  os << begl << "AVChapter **chapters: "
      << AVChapterArray(value->chapters, value->nb_chapters);
  os << begl << "AVDictionary *metadata: " << value->metadata;
  os << begl << "int64_t start_time_realtime: " << value->start_time_realtime
      << std::endl;
  os << begl << "int fps_probe_size: " << value->fps_probe_size << std::endl;
  os << begl << "int error_recognition: "
      << value->error_recognition << std::endl;
  os << begl << "int64_t max_interleave_delta: "
      << value->max_interleave_delta << std::endl;
  os << begl << "int strict_std_compliance: "
      << value->strict_std_compliance << std::endl;
  os << begl << "int event_flags: " << AVFMT_EVENTFlags(value->flags);
  os << begl << "int max_ts_probe: " << value->max_ts_probe << std::endl;
  os << begl << "int avoid_negative_ts: "
      << AVFMT_AVOID_NEG_TSFlags(value->avoid_negative_ts);
  os << begl << "int ts_id: " << value->ts_id << std::endl;
  os << begl << "int audio_preload: " << value->audio_preload << std::endl;
  os << begl << "int max_chunk_duration: "
      << value->max_chunk_duration << std::endl;
  os << begl << "int max_chunk_size: " << value->max_chunk_size << std::endl;
  os << begl << "int use_wallclock_as_timestamps: "
      << value->use_wallclock_as_timestamps << std::endl;
  os << begl << "int avio_flags: " << value->avio_flags << std::endl;
  os << begl << "AVDurationEstimationMethod duration_estimation_method: "
      << value->duration_estimation_method;
  os << begl << "int64_t skip_initial_bytes: " << value->skip_initial_bytes
      << std::endl;
  os << begl << "TODO(dalesat): more" << std::endl;
  return os << outdent;
}

}  // namespace media
}  // namespace mojo
