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
|