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