You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
111 lines
3.4 KiB
111 lines
3.4 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
//---------------------------------------------------------------------------------------- |
|
|
|
#ifndef WEBM_RECORDER_H |
|
#define WEBM_RECORDER_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
//-------------------------------------------------------------------------------- |
|
//#include "" |
|
|
|
#include "video/ivideoservices.h" |
|
|
|
#include "video_macros.h" |
|
#include "webm_common.h" |
|
|
|
// comment out to prevent logging of creation data |
|
//#define LOG_ENCODER_OPERATIONS |
|
|
|
#if defined( LOG_ENCODER_OPERATIONS ) || defined( LOG_ENCODER_AUDIO_OPERATIONS ) || defined ( LOG_FRAMES_TO_TGA ) || defined ( ENABLE_EXTERNAL_ENCODER_LOGGING ) |
|
#include <filesystem.h> |
|
#endif |
|
|
|
|
|
class CWebMVideoRecorder : public IVideoRecorder |
|
{ |
|
public: |
|
CWebMVideoRecorder(); |
|
~CWebMVideoRecorder(); |
|
|
|
virtual bool EstimateMovieFileSize( size_t *pEstSize, int movieWidth, int movieHeight, VideoFrameRate_t movieFps, float movieDuration, VideoEncodeCodec_t theCodec, int videoQuality, AudioEncodeSourceFormat_t srcAudioFormat = AudioEncodeSourceFormat::AUDIO_NONE, int audioSampleRate = 0 ); |
|
|
|
virtual bool CreateNewMovieFile( const char *pFilename, bool hasAudioTrack = false ); |
|
|
|
virtual bool SetMovieVideoParameters( VideoEncodeCodec_t theCodec, int videoQuality, int movieFrameWidth, int movieFrameHeight, VideoFrameRate_t movieFPS, VideoEncodeGamma_t gamma = VideoEncodeGamma::NO_GAMMA_ADJUST ); |
|
virtual bool SetMovieSourceImageParameters( VideoEncodeSourceFormat_t srcImageFormat, int imgWidth, int imgHeight ); |
|
virtual bool SetMovieSourceAudioParameters( AudioEncodeSourceFormat_t srcAudioFormat = AudioEncodeSourceFormat::AUDIO_NONE, int audioSampleRate = 0, AudioEncodeOptions_t audioOptions = AudioEncodeOptions::NO_AUDIO_OPTIONS, int audioSampleGroupSize = 0 ); |
|
|
|
virtual bool IsReadyToRecord(); |
|
virtual VideoResult_t GetLastResult(); |
|
|
|
virtual bool AppendVideoFrame( void *pFrameBuffer, int nStrideAdjustBytes = 0 ); |
|
virtual bool AppendAudioSamples( void *pSampleBuffer, size_t sampleSize ); |
|
|
|
virtual int GetFrameCount(); |
|
virtual int GetSampleCount(); |
|
virtual int GetSampleRate(); |
|
virtual VideoFrameRate_t GetFPS(); |
|
|
|
virtual bool AbortMovie(); |
|
virtual bool FinishMovie( bool SaveMovieToDisk = true ); |
|
|
|
private: |
|
bool FlushAudioSamples(); |
|
void ConvertBGRAToYV12( void *pFrameBuffer, int nStrideAdjustBytes, vpx_image_t *m_SrcImageYV12Buffer, bool fIncludesAlpha ); |
|
void SetResult( VideoResult_t resultCode ); |
|
|
|
float GetVideoDataRate( int quality, int width, int height ); |
|
float GetAudioDataRate( int quality, int width, int height ); |
|
|
|
VideoResult_t m_LastResult; |
|
bool m_bHasAudio; |
|
bool m_bMovieFinished; |
|
|
|
int m_nFramesAdded; |
|
int m_nAudioFramesAdded; |
|
int m_nSamplesAdded; |
|
|
|
VideoFrameRate_t m_MovieRecordFPS; |
|
int m_MovieTimeScale; |
|
int m_DurationPerFrame; |
|
|
|
unsigned long m_FrameDuration; |
|
|
|
int m_MovieFrameWidth; |
|
int m_MovieFrameHeight; |
|
|
|
vpx_image_t *m_SrcImageYV12Buffer; |
|
|
|
VideoEncodeGamma_t m_MovieGamma; |
|
|
|
VideoEncodeSourceFormat_t m_SrcImageFormat; |
|
int m_SrcImageWidth; |
|
int m_SrcImageHeight; |
|
|
|
// WebM VPX |
|
vpx_codec_ctx_t m_vpxContext; |
|
vpx_codec_enc_cfg_t m_vpxConfig; |
|
mkvmuxer::MkvWriter m_mkvWriter; |
|
mkvmuxer::Segment m_mkvMuxerSegment; |
|
uint64 m_vid_track; |
|
|
|
// Vorbis audio |
|
uint64 m_aud_track; |
|
int m_audioChannels; |
|
int m_audioSampleRate; |
|
int m_audioSampleGroupSize; |
|
int m_audioBitDepth; |
|
|
|
vorbis_info m_vi; |
|
vorbis_dsp_state m_vd; |
|
vorbis_block m_vb; |
|
vorbis_comment m_vc; |
|
}; |
|
|
|
|
|
|
|
#endif // WEBM_RECORDER_H
|
|
|