diff options
Diffstat (limited to 'dom/media/encoder/VP8TrackEncoder.h')
-rw-r--r-- | dom/media/encoder/VP8TrackEncoder.h | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/dom/media/encoder/VP8TrackEncoder.h b/dom/media/encoder/VP8TrackEncoder.h new file mode 100644 index 000000000..5a046ee5d --- /dev/null +++ b/dom/media/encoder/VP8TrackEncoder.h @@ -0,0 +1,99 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-*/ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this file, + * You can obtain one at http://mozilla.org/MPL/2.0/. */ + +#ifndef VP8TrackEncoder_h_ +#define VP8TrackEncoder_h_ + +#include "TrackEncoder.h" +#include "vpx/vpx_codec.h" + +namespace mozilla { + +typedef struct vpx_codec_ctx vpx_codec_ctx_t; +typedef struct vpx_codec_enc_cfg vpx_codec_enc_cfg_t; +typedef struct vpx_image vpx_image_t; + +/** + * VP8TrackEncoder implements VideoTrackEncoder by using libvpx library. + * We implement a realtime and fixed FPS encoder. In order to achieve that, + * there is a pick target frame and drop frame encoding policy implemented in + * GetEncodedTrack. + */ +class VP8TrackEncoder : public VideoTrackEncoder +{ + enum EncodeOperation { + ENCODE_NORMAL_FRAME, // VP8 track encoder works normally. + ENCODE_I_FRAME, // The next frame will be encoded as I-Frame. + SKIP_FRAME, // Skip the next frame. + }; +public: + explicit VP8TrackEncoder(TrackRate aTrackRate); + virtual ~VP8TrackEncoder(); + + already_AddRefed<TrackMetadataBase> GetMetadata() final override; + + nsresult GetEncodedTrack(EncodedFrameContainer& aData) final override; + + void ReplyGetSourceSurface(already_AddRefed<gfx::SourceSurface> aSurf); +protected: + nsresult Init(int32_t aWidth, int32_t aHeight, + int32_t aDisplayWidth, int32_t aDisplayHeight) final override; + +private: + // Calculate the target frame's encoded duration. + StreamTime CalculateEncodedDuration(StreamTime aDurationCopied); + + // Calculate the mRemainingTicks for next target frame. + StreamTime CalculateRemainingTicks(StreamTime aDurationCopied, + StreamTime aEncodedDuration); + + // Get the EncodeOperation for next target frame. + EncodeOperation GetNextEncodeOperation(TimeDuration aTimeElapsed, + StreamTime aProcessedDuration); + + // Get the encoded data from encoder to aData. + // Return value: false if the vpx_codec_get_cx_data returns null + // for EOS detection. + bool GetEncodedPartitions(EncodedFrameContainer& aData); + + // Prepare the input data to the mVPXImageWrapper for encoding. + nsresult PrepareRawFrame(VideoChunk &aChunk); + + already_AddRefed<gfx::SourceSurface> GetSourceSurface(already_AddRefed<layers::Image> aImg); + + // Output frame rate. + uint32_t mEncodedFrameRate; + // Duration for the output frame, reciprocal to mEncodedFrameRate. + StreamTime mEncodedFrameDuration; + // Encoded timestamp. + StreamTime mEncodedTimestamp; + // Duration to the next encode frame. + StreamTime mRemainingTicks; + + // Muted frame, we only create it once. + RefPtr<layers::Image> mMuteFrame; + + // I420 frame, for converting to I420. + nsTArray<uint8_t> mI420Frame; + + /** + * A local segment queue which takes the raw data out from mRawSegment in the + * call of GetEncodedTrack(). Since we implement the fixed FPS encoding + * policy, it needs to be global in order to store the leftover segments + * taken from mRawSegment. + */ + VideoSegment mSourceSegment; + + // VP8 relative members. + // Codec context structure. + nsAutoPtr<vpx_codec_ctx_t> mVPXContext; + // Image Descriptor. + nsAutoPtr<vpx_image_t> mVPXImageWrapper; + RefPtr<gfx::SourceSurface> mSourceSurface; +}; + +} // namespace mozilla + +#endif |