#ifndef libavwrapper_H #define libavwrapper_H #ifndef UINT64_C #define UINT64_C(c) (c ## ULL) #endif #include "Poco/Mutex.h" extern "C" { #include #include #include #include #include // ????????? //#include } #include #include #include #include #include #include #include namespace libav { static bool b_is_one_time_inited=false; // Some libavcodec calls are not reentrant void maybeInitFFMpegLib(); static int sws_flags = SWS_BICUBIC; class video_decoder { public: video_decoder(){ maybeInitFFMpegLib(); pixfmts[0] = FFMS_GetPixFmt("rgb24"); pixfmts[1] = -1; h=0; w=0; source=NULL; loaded=false; err.Buffer = errmsg; err.BufferSize = sizeof(errmsg); err.ErrorType = FFMS_ERROR_SUCCESS; err.SubType = FFMS_ERROR_SUCCESS; } ~video_decoder(){ cleanup(); } void cleanup(); bool open(const std::string& filename); float get_framerate(){ if (loaded) return (((float)props->FPSNumerator)/((float)props->FPSDenominator)); else return -1.0f; } int get_number_frames(){ if (loaded) return props->NumFrames; else return -1; } int get_number_channels(){ return 3; //this is what we convert to } int get_width(){ return w; } int get_height(){ return h; } bool fetch_frame(int width,int height,int wanted){ if (FFMS_SetOutputFormatV2(source, pixfmts, width, height, FFMS_RESIZER_BICUBIC, &err)) { std::cerr<<"ffmpegsource: "<NumFrames, &err); if (frame == NULL) { std::cerr<<"ffmpegsource: "<SampleFormat; else return 0; } int get_sample_rate(){ if (props) return props->SampleRate; else return 0; } int get_bit_depth(){ if (props) return props->BitsPerSample; else return 0; } int get_number_channels(){ if (props) return props->Channels; else return 0; } int get_number_samples(){ if (props) return props->NumSamples; else return 0; } int64_t get_channel_layout(){ if (props) return props->ChannelLayout; else return 0; } float get_duration(){ if (props) return ((float)props->NumSamples)/props->SampleRate; else return 0; } bool get_samples(void *buf,int64_t start, int64_t count){ if (source) { if (FFMS_GetAudio(source, buf, start, count, &err)) { std::cerr<<"ffmpegsource: "<