// Copyright 2018 Google Inc. 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.

// This file contains the creation of the specialized VideoDecoderImpl object
// corresponding to the version of the dynamically loaded ffmpeg library.

#include "starboard/shared/ffmpeg/ffmpeg_video_decoder.h"

#include "starboard/memory.h"
#include "starboard/player.h"
#include "starboard/shared/ffmpeg/ffmpeg_dispatch.h"
#include "starboard/shared/ffmpeg/ffmpeg_video_decoder_impl.h"

namespace starboard {
namespace shared {
namespace ffmpeg {

// static
VideoDecoder* VideoDecoder::Create(
    SbMediaVideoCodec video_codec,
    SbPlayerOutputMode output_mode,
    SbDecodeTargetGraphicsContextProvider*
        decode_target_graphics_context_provider) {
  FFMPEGDispatch* ffmpeg = FFMPEGDispatch::GetInstance();
  if (!ffmpeg || !ffmpeg->is_valid()) {
    SB_NOTREACHED();
    return NULL;
  }

  VideoDecoder* video_decoder = NULL;
  switch (ffmpeg->specialization_version()) {
    case 540:
      video_decoder = VideoDecoderImpl<540>::Create(
          video_codec, output_mode, decode_target_graphics_context_provider);
      break;
    case 550:
    case 560:
      video_decoder = VideoDecoderImpl<560>::Create(
          video_codec, output_mode, decode_target_graphics_context_provider);
      break;
    case 571:
      video_decoder = VideoDecoderImpl<571>::Create(
          video_codec, output_mode, decode_target_graphics_context_provider);
      break;
    default:
      SB_NOTREACHED() << "Unsupported FFMPEG version " << std::hex
                      << ffmpeg->avutil_version();
      break;
  }
  return video_decoder;
}
}  // namespace ffmpeg
}  // namespace shared
}  // namespace starboard
