diff options
Diffstat (limited to 'Src/nsv/nsvencode.h')
-rw-r--r-- | Src/nsv/nsvencode.h | 221 |
1 files changed, 221 insertions, 0 deletions
diff --git a/Src/nsv/nsvencode.h b/Src/nsv/nsvencode.h new file mode 100644 index 00000000..39f1f907 --- /dev/null +++ b/Src/nsv/nsvencode.h @@ -0,0 +1,221 @@ +#ifndef _NSVENCODE_H_ +#define _NSVENCODE_H_ + +#include "../jnetlib/jnetlib.h" +#include "nsvlib.h" +#include "enc_if.h" +#include <stdio.h> + +class nsv_Encoder +{ + public: + nsv_Encoder(); + ~nsv_Encoder(); + + + static void freeCoders(); // call this before quitting if you used any nsvencoders + static void loadCoders(); + static HWND configAudio(unsigned int audfmt, HWND hwndParent, char *configfile); + static HWND configVideo(unsigned int vidfmt, HWND hwndParent, char *configfile); + static int enumAudio(int *state, char *name, unsigned int *fmt); + static int enumVideo(int *state, char *name, unsigned int *fmt); + + + char *getError() { return m_err; } // NULL on no error + + // compressor configuration (do not call these after calling openOutput()) + void setVideo(unsigned int vfmt, unsigned int w, unsigned int h, double frt, + unsigned int srcfmt=NSV_MAKETYPE('R','G','B','A'), + char *configfile=NULL); + void setAudio(unsigned int afmt, int srate, int nch, int bps, + unsigned int srcfmt=NSV_MAKETYPE('P','C','M',' '), + char *configfile=NULL); + + // stream configuration (do not call these after calling openOutput()) + void setMaxAudioSendAhead(int offs) { m_audio_ahead_of_video=offs; } + void setSyncFrameInterval(int minimum=0, int maximum=120) { m_max_syncframe_dist=maximum; m_min_syncframe_dist=minimum; } + + // setting one of these will enable file header writing on files + // do NOT call these after calling openOutput(), + int addHdrMetaData(char *name, char *data, int data_len); // returns nonzero on error + int setHdrMetaData(char *data, int data_len); // nonzero on error + void setHdrTOCSize(int tocsize); + void forceHdrWrite() { m_usefilehdr=1; } // use if you dont want meta or toc, but want a basic header + + // output (call only once, do not close and reopen (yet)) + void openOutput(char *url); // call getError to check for error + void closeOutput(); + + // encode (call only after openoutput()) + void addAudioData(void *data, int data_len); + int needAudioData(); // returns 1 if more audio data would be nice for sync, 2 if there is no audio data in buffer + + // for audio only, use compressor type NONE and call this with NULL + void addVideoFrame(void *frame); + // calling this will put the aux data in the same frame as the NEXT addVideoFrame() + void addAuxData(unsigned int fmt, void *data, int data_len); + + // setting audio eof will let the audio compressor know that it is the end of stream + // so that it can flush (via passing an empty frame to it) + void set_audioEof(int eof) { m_audio_eof=!!eof; } + int get_audioEof() { return m_audio_eof; } + + // stats + unsigned int getCurrentBitrate() + { + if (m_video_position_frames) + return (unsigned int) ((double) m_bitstreambytesout / ((double) m_video_position_frames / m_framerate) * 8.0); + return 0; + } + + + private: + + char *m_err; + + int m_usefilehdr; + unsigned int m_tocsize; + int m_audio_channels; + int m_audio_samplerate; + int m_audio_bits; + unsigned int m_audio_srcfmt; + unsigned int m_audio_coder; + char *m_audio_configfile; + + + double m_framerate; + unsigned int m_w, m_h; + unsigned int m_video_coder; + unsigned int m_video_srcfmt; + char *m_video_configfile; + + int m_audio_ahead_of_video; + + int m_max_syncframe_dist,m_min_syncframe_dist; + nsv_fileHeader m_filehdr; + + FILE *m_outfile; + JNL_Connection *m_outcon; + int m_is_uvox; // for m_outco + char *m_outcon_host,*m_outcon_headers; + int m_outcon_port; + unsigned int m_outcon_last_connect_time; + + nsv_Packeter m_packeter; + nsv_InBS m_outconbs; + __int64 m_bitstreambytesout; + + AudioCoder *m_audcoder; + VideoCoder *m_vidcoder; + + __int64 m_audio_position_bytes; + __int64 m_video_position_frames; + char m_vidobuf[NSV_MAX_VIDEO_LEN]; + char m_audobuf[NSV_MAX_AUDIO_LEN]; + nsv_InBS m_audibuf; + unsigned int m_total_frames; + nsv_GrowBuf m_tocEntries; + int m_frames_since_last_sync_frame; + int m_audio_eof; + + void send_uvoxmessage(int msgclass, int msgtype, void *msg, int msglen); + + + static VideoCoder *init_video(int w, int h, double frt, unsigned int pixt, unsigned int *outt, char *configfile); + static AudioCoder *init_audio(int nch, int srate, int bps, unsigned int srct, unsigned int *outt, char *configfile); + static int Coders_loaded; + static HINSTANCE g_Coders[256]; + static int g_numCoders; + static char g_dll_dir[MAX_PATH]; + static BOOL CALLBACK PcmProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam); + + + +}; + + + +class nsv_EncoderConfigFile +{ + public: + + nsv_EncoderConfigFile(char *filename=NULL) + { + m_filename=filename?_strdup(filename):0; + m_audfmt=m_vidfmt=0; + m_minsync=0; + m_maxsync=120; + m_audiosendahead=0; + m_hdrwrite=0; + m_hdrtoc=1024; + m_metadata=0; + m_crop_l=0; // ## + m_crop_r=0; // ## + m_crop_t=0; // ## + m_crop_b=0; // ## + + ReadIn(); + } + + + ~nsv_EncoderConfigFile(); //ak 7-23-03 moved so breakpoint can be set + unsigned int getVidFmt() { return m_vidfmt; } + unsigned int getAudFmt() { return m_audfmt; } + void setVidFmt(unsigned int fmt) { m_vidfmt=fmt; } + void setAudFmt(unsigned int fmt) { m_audfmt=fmt; } + + char *getFilename() { return m_filename; } + void setFilename(char *filename) + { + FlushOut(); + free(m_filename); + if (filename) + { + m_filename=_strdup(filename); + ReadIn(); + } + else m_filename=0; + } + + int getMinSyncFrameInt() { return m_minsync; } + void setMinSyncFrameInt(int minint) { m_minsync=minint; } + int getMaxSyncFrameInt() { return m_maxsync; } + void setMaxSyncFrameInt(int maxint) { m_maxsync=maxint; } + int getAudioSendAhead() { return m_audiosendahead; } + void setAudioSendAhead(int sa) { m_audiosendahead=sa; } + + char *hdrGetMetadata() { return m_metadata; } + int hdrGetDoWrite() { return m_hdrwrite; } + int hdrSetDoWrite(int dw) { m_hdrwrite=!!dw; } + int hdrGetTOCSize() { return m_hdrtoc; } + int hdrSetTOCSize(int ts) { m_hdrtoc=ts; } + + int ConfigUI(HINSTANCE hInstance, HWND hwndParent); + + private: + + void FlushOut(); + void ReadIn(); + + static BOOL CALLBACK _dialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam); + BOOL dialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam,LPARAM lParam); + HWND audio_hwnd, video_hwnd; + void initConfigChildWindows(HWND hwndDlg, int flags); + + char *m_filename; + + unsigned int m_audfmt,m_vidfmt; + int m_minsync, m_maxsync; + int m_audiosendahead; + int m_hdrwrite; + int m_hdrtoc; + char *m_metadata; + + public: + int m_crop_l; // ## + int m_crop_r; // ## + int m_crop_t; // ## + int m_crop_b; // ## +}; + +#endif//_NSVENCODE_H_
\ No newline at end of file |