From 1e16a4cd123aafe41d51f01b41fad5a77c4ffbe3 Mon Sep 17 00:00:00 2001 From: Sven Gothel Date: Mon, 16 Apr 2012 21:30:52 +0200 Subject: Adding initial Libav/FFMpeg GLMediaPlayer implementation The Java classes already slipped through in commit 10935e1ec0d8ed677bc3fddfaa8cd73898a3bcbf - oops. Since we cannot provide a Libav binary (even though Google does in Android and Chrome) due to legal uncertainities .. we dynamically link to an existing Libav / FFmpeg library in a 'relaxed' manner. Ie. we allow certain recent functions to be absent to be able to run on a wider range of Libav versions. Currently tested on Debian Linux and Windows7 64bit/32bit Binaries for Win/OSX: - Windows http://ffmpeg.zeranoe.com/builds/ - OSX http://www.ffmpegx.com/ Features: - Dynamic relaxed linking to Libav (see above) - YUV420P texture lookup function shader stub (conversion to RGB) - 1-copy only (decoder buffer to texture) - simple - uses libavformat's network streaming - fixes some odd PTS values TODO: - Audio output (Should use OpenAL, duh) - Seek works poorly - Offthread multi-texture fetching for smoother animation - Maybe more pixelformat conversions --- src/jogl/native/libav/ffmpeg_tool.h | 106 ++++++++++++++++++++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 src/jogl/native/libav/ffmpeg_tool.h (limited to 'src/jogl/native/libav/ffmpeg_tool.h') diff --git a/src/jogl/native/libav/ffmpeg_tool.h b/src/jogl/native/libav/ffmpeg_tool.h new file mode 100644 index 000000000..3181a8a8f --- /dev/null +++ b/src/jogl/native/libav/ffmpeg_tool.h @@ -0,0 +1,106 @@ +/** + * Copyright 2012 JogAmp Community. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY JogAmp Community ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL JogAmp Community OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of JogAmp Community. + */ + +#ifndef _FFMPEG_TOOL_H +#define _FFMPEG_TOOL_H + +#ifdef _WIN32 + #include + // __declspec(dllimport) void __stdcall Sleep(unsigned long dwMilliseconds); + + #define usleep(t) Sleep((t) / 1000) +#endif + +#include +#include +#include +#include + +#include +#include + +#include +#include +#include + +/** + * AV_TIME_BASE 1000000 + */ +#define AV_TIME_BASE_MSEC (AV_TIME_BASE/1000) + +static inline float my_av_q2f(AVRational a){ + return a.num / (float) a.den; +} +static inline int32_t my_av_q2i32(int32_t snum, AVRational a){ + return (snum * a.num) / a.den; +} + +typedef struct { + int32_t verbose; + + AVFormatContext* pFormatCtx; + int32_t vid; + AVStream* pVStream; + AVCodecContext* pVCodecCtx; + AVCodec* pVCodec; + AVFrame* pVFrame; + uint32_t vBufferPlanes; // 1 for RGB*, 3 for YUV, .. + uint32_t vBitsPerPixel; + uint32_t vBytesPerPixelPerPlane; + enum PixelFormat vPixFmt; // native decoder fmt + int32_t vPTS; // msec - overall last video PTS + int32_t vLinesize[3]; // decoded video linesize in bytes for each plane + int32_t vTexWidth[3]; // decoded video tex width in bytes for each plane + + + int32_t aid; + AVStream* pAStream; + AVCodecContext* pACodecCtx; + AVCodec* pACodec; + AVFrame* pAFrame; + int32_t aSampleRate; + int32_t aChannels; + int32_t aFrameSize; + enum AVSampleFormat aSampleFmt; // native decoder fmt + int32_t aPTS; // msec - overall last audio PTS + + float fps; // frames per seconds + int32_t bps_stream; // bits per seconds + int32_t bps_video; // bits per seconds + int32_t bps_audio; // bits per seconds + int32_t totalFrames; + int32_t duration; // msec + int32_t start_time; // msec + + char acodec[64]; + char vcodec[64]; + +} FFMPEGToolBasicAV_t ; + +#endif /* _FFMPEG_TOOL_H */ + -- cgit v1.2.3