1868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)// Copyright 2013 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#ifndef MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_FFMPEG_CDM_VIDEO_DECODER_H_
65d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#define MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_FFMPEG_CDM_VIDEO_DECODER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
1068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "base/memory/scoped_ptr.h"
115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cdm/ppapi/external_clear_key/cdm_video_decoder.h"
125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "media/cdm/ppapi/external_clear_key/clear_key_cdm_common.h"
13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "media/ffmpeg/ffmpeg_deleters.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVCodecContext;
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AVFrame;
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdochnamespace media {
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class FFmpegCdmVideoDecoder : public CdmVideoDecoder {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
22f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  explicit FFmpegCdmVideoDecoder(ClearKeyCdmHost* host);
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual ~FFmpegCdmVideoDecoder();
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // CdmVideoDecoder implementation.
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool Initialize(const cdm::VideoDecoderConfig& config) OVERRIDE;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Deinitialize() OVERRIDE;
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void Reset() OVERRIDE;
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual cdm::Status DecodeFrame(const uint8_t* compressed_frame,
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  int32_t compressed_frame_size,
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  int64_t timestamp,
322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                  cdm::VideoFrame* decoded_frame) OVERRIDE;
332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool is_initialized() const OVERRIDE { return is_initialized_; }
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns true when |format| and |data_size| specify a supported video
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // output configuration.
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static bool IsValidOutputConfig(cdm::VideoFormat format,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                  const cdm::Size& data_size);
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Allocates storage, then copies video frame stored in |av_frame_| to
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |cdm_video_frame|. Returns true when allocation and copy succeed.
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool CopyAvFrameTo(cdm::VideoFrame* cdm_video_frame);
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ReleaseFFmpegResources();
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // FFmpeg structures owned by this object.
48a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<AVCodecContext, ScopedPtrAVFreeContext> codec_context_;
49a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  scoped_ptr<AVFrame, ScopedPtrAVFreeFrame> av_frame_;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_initialized_;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
53f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  ClearKeyCdmHost* const host_;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(FFmpegCdmVideoDecoder);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
58ba5b9a6411cb1792fd21f0a078d7a25cd1ceec16Ben Murdoch}  // namespace media
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif  // MEDIA_CDM_PPAPI_EXTERNAL_CLEAR_KEY_FFMPEG_CDM_VIDEO_DECODER_H_
61