gecko-dev/media/gmp-clearkey/0.1/VideoDecoder.h
Chris Pearce f96fedca29 Bug 1351954 - Change ClearKey CDM to allocate its video frame buffers optimally. r=gerald
The WMF decoder gives us video frames in buffers with the planes 16 row-aligned
for some reason. If we allocate our video frames the same size we waste memory.
So let's have the ClearKey CDM not allocate its video frames with the extra
padding rows.

Excluding the padding in our copy of the decoded data also makes my work in bug
1351953 easier.

MozReview-Commit-ID: 9dD40P6ST68

--HG--
extra : rebase_source : a6c4fea01e8bf2deef8edc78d0a041e8fed0c0b8
extra : source : 433028f9a2055869cd98710f0871d040605c0535
2017-03-28 18:00:01 +13:00

76 lines
2.0 KiB
C++

/*
* Copyright 2013, Mozilla Foundation and contributors
*
* 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.
*/
#ifndef __VideoDecoder_h__
#define __VideoDecoder_h__
#include <atomic>
#include <queue>
#include <thread>
// This include is required in order for content_decryption_module to work
// on Unix systems.
#include "stddef.h"
#include "content_decryption_module.h"
#include "WMFH264Decoder.h"
class VideoDecoder : public RefCounted
{
public:
explicit VideoDecoder(cdm::Host_8 *aHost);
cdm::Status InitDecode(const cdm::VideoDecoderConfig& aConfig);
cdm::Status Decode(const cdm::InputBuffer& aEncryptedBuffer,
cdm::VideoFrame* aVideoFrame);
void Reset();
void DecodingComplete();
bool HasShutdown() { return mHasShutdown; }
private:
virtual ~VideoDecoder();
cdm::Status Drain(cdm::VideoFrame* aVideoFrame);
struct DecodeData {
std::vector<uint8_t> mBuffer;
uint64_t mTimestamp = 0;
CryptoMetaData mCrypto;
};
cdm::Status OutputFrame(cdm::VideoFrame* aVideoFrame);
HRESULT SampleToVideoFrame(IMFSample* aSample,
int32_t aPictureWidth,
int32_t aPictureHeight,
int32_t aStride,
int32_t aFrameHeight,
cdm::VideoFrame* aVideoFrame);
cdm::Host_8* mHost;
wmf::AutoPtr<wmf::WMFH264Decoder> mDecoder;
std::queue<wmf::CComPtr<IMFSample>> mOutputQueue;
bool mHasShutdown;
};
#endif // __VideoDecoder_h__