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

#include "media/base/pipeline_status.h"

#include <ostream>

namespace media {

absl::optional<PipelineStatus> StatusCodeToPipelineStatus(StatusCode status) {
  switch (status) {
    case StatusCode::kOk:
      return PIPELINE_OK;
    case StatusCode::kPipelineErrorNetwork:
      return PIPELINE_ERROR_NETWORK;
    case StatusCode::kPipelineErrorDecode:
      return PIPELINE_ERROR_DECODE;
    case StatusCode::kPipelineErrorAbort:
      return PIPELINE_ERROR_ABORT;
    case StatusCode::kPipelineErrorInitializationFailed:
      return PIPELINE_ERROR_INITIALIZATION_FAILED;
    case StatusCode::kPipelineErrorCouldNotRender:
      return PIPELINE_ERROR_COULD_NOT_RENDER;
    case StatusCode::kPipelineErrorRead:
      return PIPELINE_ERROR_READ;
    case StatusCode::kPipelineErrorInvalidState:
      return PIPELINE_ERROR_INVALID_STATE;
    case StatusCode::kPipelineErrorDemuxerErrorCouldNotOpen:
      return DEMUXER_ERROR_COULD_NOT_OPEN;
    case StatusCode::kPipelineErrorDemuxerErrorCouldNotParse:
      return DEMUXER_ERROR_COULD_NOT_PARSE;
    case StatusCode::kPipelineErrorDemuxerErrorNoSupportedStreams:
      return DEMUXER_ERROR_NO_SUPPORTED_STREAMS;
    case StatusCode::kPipelineErrorDecoderErrorNotSupported:
      return DECODER_ERROR_NOT_SUPPORTED;
    case StatusCode::kPipelineErrorChuckDemuxerErrorAppendFailed:
      return CHUNK_DEMUXER_ERROR_APPEND_FAILED;
    case StatusCode::kPipelineErrorChunkDemuxerErrorEosStatusDecodeError:
      return CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR;
    case StatusCode::kPipelineErrorChunkDemuxerErrorEosStatusNetworkError:
      return CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR;
    case StatusCode::kPipelineErrorAudioRendererError:
      return AUDIO_RENDERER_ERROR;
    case StatusCode::kPipelineErrorExternalRendererFailed:
      return PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED;
    case StatusCode::kPipelineErrorDemuxerErrorDetectedHLS:
      return DEMUXER_ERROR_DETECTED_HLS;
    case StatusCode::kPipelineErrorHardwareContextReset:
      return PIPELINE_ERROR_HARDWARE_CONTEXT_RESET;
    default:
      NOTREACHED();
      return absl::nullopt;
  }
}

StatusCode PipelineStatusToStatusCode(PipelineStatus status) {
  switch (status) {
    case PIPELINE_OK:
      return StatusCode::kOk;
    case PIPELINE_ERROR_NETWORK:
      return StatusCode::kPipelineErrorNetwork;
    case PIPELINE_ERROR_DECODE:
      return StatusCode::kPipelineErrorDecode;
    case PIPELINE_ERROR_ABORT:
      return StatusCode::kPipelineErrorAbort;
    case PIPELINE_ERROR_INITIALIZATION_FAILED:
      return StatusCode::kPipelineErrorInitializationFailed;
    case PIPELINE_ERROR_COULD_NOT_RENDER:
      return StatusCode::kPipelineErrorCouldNotRender;
    case PIPELINE_ERROR_READ:
      return StatusCode::kPipelineErrorRead;
    case PIPELINE_ERROR_INVALID_STATE:
      return StatusCode::kPipelineErrorInvalidState;
    case DEMUXER_ERROR_COULD_NOT_OPEN:
      return StatusCode::kPipelineErrorDemuxerErrorCouldNotOpen;
    case DEMUXER_ERROR_COULD_NOT_PARSE:
      return StatusCode::kPipelineErrorDemuxerErrorCouldNotParse;
    case DEMUXER_ERROR_NO_SUPPORTED_STREAMS:
      return StatusCode::kPipelineErrorDemuxerErrorNoSupportedStreams;
    case DECODER_ERROR_NOT_SUPPORTED:
      return StatusCode::kPipelineErrorDecoderErrorNotSupported;
    case CHUNK_DEMUXER_ERROR_APPEND_FAILED:
      return StatusCode::kPipelineErrorChuckDemuxerErrorAppendFailed;
    case CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR:
      return StatusCode::kPipelineErrorChunkDemuxerErrorEosStatusDecodeError;
    case CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR:
      return StatusCode::kPipelineErrorChunkDemuxerErrorEosStatusNetworkError;
    case AUDIO_RENDERER_ERROR:
      return StatusCode::kPipelineErrorAudioRendererError;
    case PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED:
      return StatusCode::kPipelineErrorExternalRendererFailed;
    case DEMUXER_ERROR_DETECTED_HLS:
      return StatusCode::kPipelineErrorDemuxerErrorDetectedHLS;
    case PIPELINE_ERROR_HARDWARE_CONTEXT_RESET:
      return StatusCode::kPipelineErrorHardwareContextReset;
  }

  NOTREACHED();
  // TODO(crbug.com/1153465): Log pipeline status that failed to convert.
  // Return a generic decode error.
  return StatusCode::kPipelineErrorDecode;
}

std::string PipelineStatusToString(PipelineStatus status) {
#define STRINGIFY_STATUS_CASE(status) \
  case status:                        \
    return #status

  switch (status) {
    STRINGIFY_STATUS_CASE(PIPELINE_OK);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_NETWORK);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_DECODE);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_ABORT);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_INITIALIZATION_FAILED);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_COULD_NOT_RENDER);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_EXTERNAL_RENDERER_FAILED);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_READ);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_INVALID_STATE);
    STRINGIFY_STATUS_CASE(PIPELINE_ERROR_HARDWARE_CONTEXT_RESET);
    STRINGIFY_STATUS_CASE(DEMUXER_ERROR_COULD_NOT_OPEN);
    STRINGIFY_STATUS_CASE(DEMUXER_ERROR_COULD_NOT_PARSE);
    STRINGIFY_STATUS_CASE(DEMUXER_ERROR_NO_SUPPORTED_STREAMS);
    STRINGIFY_STATUS_CASE(DEMUXER_ERROR_DETECTED_HLS);
    STRINGIFY_STATUS_CASE(DECODER_ERROR_NOT_SUPPORTED);
    STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_APPEND_FAILED);
    STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_EOS_STATUS_DECODE_ERROR);
    STRINGIFY_STATUS_CASE(CHUNK_DEMUXER_ERROR_EOS_STATUS_NETWORK_ERROR);
    STRINGIFY_STATUS_CASE(AUDIO_RENDERER_ERROR);
  }

#undef STRINGIFY_STATUS_CASE

  NOTREACHED();
  return "";
}

std::ostream& operator<<(std::ostream& out, PipelineStatus status) {
  return out << PipelineStatusToString(status);
}

PipelineStatistics::PipelineStatistics() = default;
PipelineStatistics::PipelineStatistics(const PipelineStatistics& other) =
    default;
PipelineStatistics::~PipelineStatistics() = default;

bool operator==(const PipelineStatistics& first,
                const PipelineStatistics& second) {
  return first.audio_bytes_decoded == second.audio_bytes_decoded &&
         first.video_bytes_decoded == second.video_bytes_decoded &&
         first.video_frames_decoded == second.video_frames_decoded &&
         first.video_frames_dropped == second.video_frames_dropped &&
         first.video_frames_decoded_power_efficient ==
             second.video_frames_decoded_power_efficient &&
         first.audio_memory_usage == second.audio_memory_usage &&
         first.video_memory_usage == second.video_memory_usage &&
         first.video_keyframe_distance_average ==
             second.video_keyframe_distance_average &&
         first.video_frame_duration_average ==
             second.video_frame_duration_average &&
         first.video_pipeline_info == second.video_pipeline_info &&
         first.audio_pipeline_info == second.audio_pipeline_info;
}

bool operator!=(const PipelineStatistics& first,
                const PipelineStatistics& second) {
  return !(first == second);
}

}  // namespace media
