1// Copyright 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_FFMPEG_CDM_VIDEO_DECODER_H_
6#define MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_FFMPEG_CDM_VIDEO_DECODER_H_
7
8#include "base/basictypes.h"
9#include "base/compiler_specific.h"
10#include "base/memory/scoped_ptr.h"
11#include "media/cdm/ppapi/external_clear_key/cdm_video_decoder.h"
12#include "media/cdm/ppapi/external_clear_key/clear_key_cdm_common.h"
13#include "media/ffmpeg/ffmpeg_deleters.h"
14
15struct AVCodecContext;
16struct AVFrame;
17
18namespace media {
19
20class FFmpegCdmVideoDecoder : public CdmVideoDecoder {
21 public:
22  explicit FFmpegCdmVideoDecoder(ClearKeyCdmHost* host);
23  virtual ~FFmpegCdmVideoDecoder();
24
25  // CdmVideoDecoder implementation.
26  virtual bool Initialize(const cdm::VideoDecoderConfig& config) OVERRIDE;
27  virtual void Deinitialize() OVERRIDE;
28  virtual void Reset() OVERRIDE;
29  virtual cdm::Status DecodeFrame(const uint8_t* compressed_frame,
30                                  int32_t compressed_frame_size,
31                                  int64_t timestamp,
32                                  cdm::VideoFrame* decoded_frame) OVERRIDE;
33  virtual bool is_initialized() const OVERRIDE { return is_initialized_; }
34
35  // Returns true when |format| and |data_size| specify a supported video
36  // output configuration.
37  static bool IsValidOutputConfig(cdm::VideoFormat format,
38                                  const cdm::Size& data_size);
39
40 private:
41  // Allocates storage, then copies video frame stored in |av_frame_| to
42  // |cdm_video_frame|. Returns true when allocation and copy succeed.
43  bool CopyAvFrameTo(cdm::VideoFrame* cdm_video_frame);
44
45  void ReleaseFFmpegResources();
46
47  // FFmpeg structures owned by this object.
48  scoped_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
49  scoped_ptr<AVFrame, ScopedPtrAVFreeFrame> av_frame_;
50
51  bool is_initialized_;
52
53  ClearKeyCdmHost* const host_;
54
55  DISALLOW_COPY_AND_ASSIGN(FFmpegCdmVideoDecoder);
56};
57
58}  // namespace media
59
60#endif  // MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_FFMPEG_CDM_VIDEO_DECODER_H_
61