Small tweaks to get libav working as well as ffmpeg, for old debian versions. Some other tweaks too

git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@5098 fc73d0e0-1445-4013-8a0c-d673dee63da5
This commit is contained in:
Spoike 2017-05-10 02:57:34 +00:00
parent 484e8bbfc2
commit f449b0eb88
6 changed files with 108 additions and 64 deletions

View File

@ -33,21 +33,21 @@ ANDROID_ZIPALIGN=$ANDROIDROOT/build-tools/$ANDROIDBUILDTOOLS/zipalign #relative
THREADS="-j 4" THREADS="-j 4"
#windows is always cross compiled, so we don't have issues with non-native avplug #windows is always cross compiled, so we don't have issues with non-native ffmpeg
PLUGINS_LINUXx86="ode qi ezhud xmpp irc" PLUGINS_LINUXx86="ode qi ezhud xmpp irc"
PLUGINS_LINUXx64="ode qi ezhud xmpp irc" PLUGINS_LINUXx64="ode qi ezhud xmpp irc"
PLUGINS_LINUXx32="qi ezhud xmpp irc" PLUGINS_LINUXx32="qi ezhud xmpp irc"
PLUGINS_LINUXarmhf="qi ezhud xmpp irc" PLUGINS_LINUXarmhf="qi ezhud xmpp irc"
if [ "$(uname -m)" != "x86_64" ]; then if [ "$(uname -m)" != "x86_64" ]; then
PLUGINS_LINUXx86="avplug ode qi ezhud xmpp irc" PLUGINS_LINUXx86="ffmpeg ode qi ezhud xmpp irc"
fi fi
if [ "$(uname -m)" == "x86_64" ]; then if [ "$(uname -m)" == "x86_64" ]; then
PLUGINS_LINUX64="avplug ode qi ezhud xmpp irc" PLUGINS_LINUX64="ffmpeg ode qi ezhud xmpp irc"
fi fi
#windows doesn't cross compile, so no system dependancy issues #windows doesn't cross compile, so no system dependancy issues
#skip some dependancies if we're running on cygwin, ode is buggy. #skip some dependancies if we're running on cygwin, ode is buggy.
if [ "$(uname -s)" == "Linux" ]; then if [ "$(uname -s)" == "Linux" ]; then
PLUGINS_WINDOWS="avplug ode qi ezhud xmpp irc" PLUGINS_WINDOWS="ffmpeg ode qi ezhud xmpp irc"
else else
PLUGINS_WINDOWS="qi ezhud xmpp irc" PLUGINS_WINDOWS="qi ezhud xmpp irc"
fi fi
@ -234,7 +234,7 @@ if [ "$BUILD_LINUXx86" == "y" ]; then
#for building linux targets #for building linux targets
debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev libvorbis-dev || otherpackages gcc || exit debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev libvorbis-dev || otherpackages gcc || exit
jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit
if [[ "$PLUGINS_LINUXx86" =~ "avplug" ]]; then if [[ "$PLUGINS_LINUXx86" =~ "ffmpeg" ]]; then
debianpackages libswscale-dev libavcodec-dev || otherpackages || exit debianpackages libswscale-dev libavcodec-dev || otherpackages || exit
fi fi
fi fi
@ -242,7 +242,7 @@ if [ "$BUILD_LINUXx64" == "y" ]; then
#for building linux targets #for building linux targets
debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev || otherpackages gcc || exit debianpackages gcc-multilib g++-multilib mesa-common-dev libasound2-dev || otherpackages gcc || exit
jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit jessiepackages libgnutls28-dev || debianpackages libgnutls28-dev || otherpackages gcc || exit
if [[ "$PLUGINS_LINUXx64" =~ "avplug" ]]; then if [[ "$PLUGINS_LINUXx64" =~ "ffmpeg" ]]; then
debianpackages libswscale-dev libavcodec-dev || otherpackages || exit debianpackages libswscale-dev libavcodec-dev || otherpackages || exit
fi fi
fi fi
@ -396,9 +396,9 @@ if [ $UID -ne 0 ] && [ $REBUILD_TOOLCHAINS == "y" ]; then
fi fi
if [ "$BUILD_WINDOWS" == "y" ]; then if [ "$BUILD_WINDOWS" == "y" ]; then
echo "Obtaining ffmpeg library (win32)..." echo "Obtaining ffmpeg library (win32)..."
make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=avplug 2>&1 >>/dev/null make FTE_TARGET=win32 plugins-rel NATIVE_PLUGINS=ffmpeg 2>&1 >>/dev/null
echo "Obtaining ffmpeg library (win64)..." echo "Obtaining ffmpeg library (win64)..."
make FTE_TARGET=win64 plugins-rel NATIVE_PLUGINS=avplug 2>&1 >>/dev/null make FTE_TARGET=win64 plugins-rel NATIVE_PLUGINS=ffmpeg 2>&1 >>/dev/null
fi fi
cd ~ cd ~
fi fi

View File

@ -19,6 +19,16 @@ SVNREVISION:=-DSVNREVISION=$(shell test -d $(BASE_DIR)/../.svn && svnversion $(B
WHOAMI:=$(shell whoami) WHOAMI:=$(shell whoami)
#update these to download+build a different version. this assumes that the url+subdirs etc contain a consistant version everywhere.
JPEGVER=9b
ZLIBVER=1.2.11
PNGVER=1.6.29
OGGVER=1.3.2
VORBISVER=1.3.5
SDLVER=2.0.5
SCINTILLAVER=373
#only limited forms of cross-making is supported #only limited forms of cross-making is supported
#only the following 3 are supported #only the following 3 are supported
#linux->win32 (FTE_TARGET=win32) RPM Package: "mingw32-gcc", DEB Package: "mingw32" #linux->win32 (FTE_TARGET=win32) RPM Package: "mingw32-gcc", DEB Package: "mingw32"
@ -926,8 +936,8 @@ ifeq (win_SDL,$(findstring win,$(FTE_TARGET))$(findstring _SDL,$(FTE_TARGET)))
EXEPOSTFIX=.exe EXEPOSTFIX=.exe
CC_MACHINE:=$(shell $(CC) -dumpmachine) CC_MACHINE:=$(shell $(CC) -dumpmachine)
ARCH_PREDEP=$(BASE_DIR)/libs/SDL2-2.0.1/$(CC_MACHINE)/bin/sdl2-config ARCH_PREDEP=$(BASE_DIR)/libs/SDL2-$(SDLVER)/$(CC_MACHINE)/bin/sdl2-config
SDLCONFIG=$(ARCH_PREDEP) --prefix=$(BASE_DIR)/libs/SDL2-2.0.1/$(CC_MACHINE) SDLCONFIG=$(ARCH_PREDEP) --prefix=$(BASE_DIR)/libs/SDL2-$(SDLVER)/$(CC_MACHINE)
ARCH_CFLAGS=`$(SDLCONFIG) --cflags` ARCH_CFLAGS=`$(SDLCONFIG) --cflags`
#the defaults for sdl come first #the defaults for sdl come first
@ -1727,7 +1737,6 @@ qccgui-dbg:
#scintilla is messy as fuck when building statically. but at least we can strip out the lexers we don't use this way. #scintilla is messy as fuck when building statically. but at least we can strip out the lexers we don't use this way.
#note that this is only used in the 'qccgui-scintilla' target. #note that this is only used in the 'qccgui-scintilla' target.
SCINTILLAVER=366
SCINTILLA_FILES= AutoComplete.o CallTip.o CaseConvert.o CaseFolder.o CellBuffer.o CharacterCategory.o CharacterSet.o CharClassify.o ContractionState.o Decoration.o Document.o EditModel.o Editor.o EditView.o KeyMap.o Indicator.o LineMarker.o MarginView.o PerLine.o PlatWin.o PositionCache.o PropSetSimple.o RESearch.o RunStyles.o Selection.o Style.o UniConversion.o ViewStyle.o XPM.o ScintillaWin.o HanjaDic.o ScintillaBase.o Accessor.o Catalogue.o ExternalLexer.o LexerBase.o LexerModule.o LexerSimple.o StyleContext.o WordList.o LexCPP.o SCINTILLA_FILES= AutoComplete.o CallTip.o CaseConvert.o CaseFolder.o CellBuffer.o CharacterCategory.o CharacterSet.o CharClassify.o ContractionState.o Decoration.o Document.o EditModel.o Editor.o EditView.o KeyMap.o Indicator.o LineMarker.o MarginView.o PerLine.o PlatWin.o PositionCache.o PropSetSimple.o RESearch.o RunStyles.o Selection.o Style.o UniConversion.o ViewStyle.o XPM.o ScintillaWin.o HanjaDic.o ScintillaBase.o Accessor.o Catalogue.o ExternalLexer.o LexerBase.o LexerModule.o LexerSimple.o StyleContext.o WordList.o LexCPP.o
SCINTILLA_ROOT=$(BASE_DIR)/scintilla$(SCINTILLAVER)/scintilla SCINTILLA_ROOT=$(BASE_DIR)/scintilla$(SCINTILLAVER)/scintilla
SCINTILLA_DIRS=$(SCINTILLA_ROOT)/lexers:$(SCINTILLA_ROOT)/lexlib:$(SCINTILLA_ROOT)/src:$(SCINTILLA_ROOT)/win32 SCINTILLA_DIRS=$(SCINTILLA_ROOT)/lexers:$(SCINTILLA_ROOT)/lexlib:$(SCINTILLA_ROOT)/src:$(SCINTILLA_ROOT)/win32
@ -1814,7 +1823,7 @@ clean:
distclean: clean distclean: clean
-rm -f droid/ftekeystore -rm -f droid/ftekeystore
-rm -f -r libs/SDL2-2.0.1 -rm -f -r libs/SDL2-$(SDLVER)
################################################# #################################################
@ -1991,12 +2000,6 @@ $(BASE_DIR)/libs/SDL2-2.0.1/x86_64-w64-mingw32/bin/sdl2-config: $(BASE_DIR)/libs
#update these to download+build a different version. this assumes that the url+subdirs etc contain a consistant version everywhere.
JPEGVER=9a
ZLIBVER=1.2.11
PNGVER=1.6.14
OGGVER=1.3.2
VORBISVER=1.3.4
#makes sure the configure scripts get the right idea. #makes sure the configure scripts get the right idea.
AR?=$(ARCH)-ar AR?=$(ARCH)-ar

View File

@ -623,8 +623,8 @@ vfsfile_t *FS_OpenSSL(const char *hostname, vfsfile_t *source, qboolean server,
// long _true = true; // long _true = true;
/* Need to enable anonymous KX specifically. */ /* Need to enable anonymous KX specifically. */
const int kx_prio[] = {GNUTLS_KX_ANON_DH, 0}; // const int kx_prio[] = {GNUTLS_KX_ANON_DH, 0};
const int cert_type_priority[3] = {GNUTLS_CRT_X509, 0}; // const int cert_type_priority[3] = {GNUTLS_CRT_X509, 0};
if (!source) if (!source)
return NULL; return NULL;
@ -680,7 +680,7 @@ vfsfile_t *FS_OpenSSL(const char *hostname, vfsfile_t *source, qboolean server,
newf->funcs.WriteBytes = SSL_Write; newf->funcs.WriteBytes = SSL_Write;
newf->funcs.Seek = SSL_Seek; newf->funcs.Seek = SSL_Seek;
newf->funcs.Tell = SSL_Tell; newf->funcs.Tell = SSL_Tell;
newf->funcs.seekingisabadplan = SS_UNSEEKABLE; newf->funcs.seekstyle = SS_UNSEEKABLE;
Q_strncpyz(newf->certname, hostname, sizeof(newf->certname)); Q_strncpyz(newf->certname, hostname, sizeof(newf->certname));

View File

@ -129,14 +129,24 @@ AV_PRE32=$(AV_VER)-win32-dev/
AV_W64=$(AV_VER)-win64-dev$(AV_ARCHIVEEXT) AV_W64=$(AV_VER)-win64-dev$(AV_ARCHIVEEXT)
AV_URL64=http://ffmpeg.zeranoe.com/builds/win64/dev/$(AV_W64) AV_URL64=http://ffmpeg.zeranoe.com/builds/win64/dev/$(AV_W64)
AV_PRE64=$(AV_VER)-win64-dev/ AV_PRE64=$(AV_VER)-win64-dev/
AV_BASE=$(OUT_DIR)/../fte_libav_$(AV_VER)/ ifeq ($(findstring win,$(FTE_TARGET)),win)
AV_BASE=$(OUT_DIR)/../fte_libav_$(AV_VER)/
endif
ifneq ($(AV_BASE),)
AV_DEP=$(AV_BASE)libavformat/avformat.h
AV_CFLAGS=-I$(AV_BASE)
AV_LDFLAGS=-L$(AV_BASE)lib$(BITS) -lavcodec -lavformat -lavutil -lswscale
else
AV_LDFLAGS=-lavcodec -lavformat -lavutil -lswscale
endif
ifeq ($(FTE_TARGET),win32) ifeq ($(FTE_TARGET),win32)
#NATIVE_PLUGINS+=avplug #NATIVE_PLUGINS+=ffmpeg
endif endif
ifeq ($(FTE_TARGET),win64) ifeq ($(FTE_TARGET),win64)
#NATIVE_PLUGINS+=avplug #NATIVE_PLUGINS+=ffmpeg
endif endif
$(AV_BASE)libavformat/avformat.h: $(AV_BASE)libavformat/avformat.h:
@ -153,13 +163,15 @@ $(AV_BASE)libavformat/avformat.h:
rm $(AV_BASE)$(AV_W64) rm $(AV_BASE)$(AV_W64)
distclean: distclean:
rm $(AV_BASE)libavformat/avformat.h rm $(AV_BASE)libavformat/avformat.h
$(OUT_DIR)/fteplug_ffmpeg$(PLUG_NATIVE_EXT): $(AV_BASE)libavformat/avformat.h $(OUT_DIR)/fteplug_ffmpeg$(PLUG_NATIVE_EXT): $(AV_DEP)
AVPLUG_OBJS= avplug/avaudio.c avplug/avencode.c avplug/avdecode.c plugin.c qvm_api.c
$(OUT_DIR)/fteplug_ffmpeg$(PLUG_NATIVE_EXT): avplug/avencode.c avplug/avdecode.c avplug/avaudio.c plugin.c qvm_api.c $(OUT_DIR)/fteplug_ffmpeg$(PLUG_NATIVE_EXT): avplug/avencode.c avplug/avdecode.c avplug/avaudio.c plugin.c qvm_api.c
$(CC) $(BASE_CFLAGS) $(CFLAGS) -DFTEPLUGIN -s -o $@ -shared $(PLUG_CFLAGS) -L$(AV_BASE)lib$(BITS) -I$(AV_BASE) $^ $(PLUG_DEFFILE) $(PLUG_LDFLAGS) -lavcodec -lavformat -lavutil -lswscale $(CC) $(BASE_CFLAGS) $(CFLAGS) -DFTEPLUGIN -s -o $@ -shared $(PLUG_CFLAGS) $(AV_CFLAGS) $(AVPLUG_OBJS) $(PLUG_DEFFILE) $(PLUG_LDFLAGS) $(AV_LDFLAGS)
#small script for ode #small script for ode
#FIXME: ode fails to compile under cygwin #FIXME: ode fails to compile under cygwin
#FIXME: race condition if you try compiling debug+release at the same time, as this makefile is invoked twice by the engine's one
ODE_ARCH=$(FTE_TARGET) ODE_ARCH=$(FTE_TARGET)
ifeq ($(ODE_ARCH),) ifeq ($(ODE_ARCH),)
ODE_ARCH=unknown ODE_ARCH=unknown

View File

@ -6,6 +6,8 @@
#include "libswscale/swscale.h" #include "libswscale/swscale.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#define TARGET_FFMPEG (LIBAVFORMAT_VERSION_MICRO >= 100)
//between av 52.31 and 54.35, lots of constants etc got renamed to gain an extra AV_ prefix. //between av 52.31 and 54.35, lots of constants etc got renamed to gain an extra AV_ prefix.
/* /*
#define AV_PIX_FMT_BGRA PIX_FMT_BGRA #define AV_PIX_FMT_BGRA PIX_FMT_BGRA
@ -27,7 +29,7 @@
BUILTIN(void, S_RawAudio, (int sourceid, void *data, int speed, int samples, int channels, int width, float volume)); BUILTIN(void, S_RawAudio, (int sourceid, void *data, int speed, int samples, int channels, int width, float volume));
#undef ARGNAMES #undef ARGNAMES
/*should probably try threading this*/ /*should probably try threading this, though I suppose it should be the engine doing that.*/
/*timing is based upon the start time. this means overflow issues with rtsp etc*/ /*timing is based upon the start time. this means overflow issues with rtsp etc*/
struct decctx struct decctx
@ -57,8 +59,8 @@ struct decctx
static qboolean AVDec_SetSize (void *vctx, int width, int height) static qboolean AVDec_SetSize (void *vctx, int width, int height)
{ {
struct decctx *ctx = (struct decctx*)vctx; struct decctx *ctx = (struct decctx*)vctx;
uint8_t *rgb_data[1]; uint8_t *rgb_data[4]; //av_image_alloc requires at least 4 entries for certain pix formats (libav (but not ffmpeg) zero-fills, so this is important).
int rgb_linesize[1]; int rgb_linesize[4];
//colourspace conversions will be fastest if we //colourspace conversions will be fastest if we
// if (width > ctx->pCodecCtx->width) // if (width > ctx->pCodecCtx->width)
@ -150,7 +152,7 @@ static void *AVDec_Create(const char *medianame)
AVCodec *pCodec; AVCodec *pCodec;
qboolean useioctx = false; qboolean useioctx = false;
/*only respond to av: media prefixes*/ /*always respond to av: media prefixes*/
if (!strncmp(medianame, "av:", 3)) if (!strncmp(medianame, "av:", 3))
{ {
medianame = medianame + 3; medianame = medianame + 3;
@ -161,8 +163,10 @@ static void *AVDec_Create(const char *medianame)
medianame = medianame + 4; medianame = medianame + 4;
//let avformat do its own avio context stuff //let avformat do its own avio context stuff
} }
else else if (strchr(medianame, ':')) //block other types of url.
return NULL; return NULL;
else //if (!strcasecmp(extension, ".roq") || !strcasecmp(extension, ".roq"))
return NULL; //roq+cin should be played back via the engine instead.
ctx = malloc(sizeof(*ctx)); ctx = malloc(sizeof(*ctx));
memset(ctx, 0, sizeof(*ctx)); memset(ctx, 0, sizeof(*ctx));
@ -195,20 +199,20 @@ small how-to note for if I ever try to add support for voice-and-video rtp decod
this stuff is presumably needed to handle ICE+stun+ports etc. this stuff is presumably needed to handle ICE+stun+ports etc.
I prolly need to hack around with adding rtcp too. :s I prolly need to hack around with adding rtcp too. :s
rtsp: Add support for depacketizing RTP data via custom IO rtsp: Add support for depacketizing RTP data via custom IO
To use this, set sdpflags=custom_io to the sdp demuxer. During To use this, set sdpflags=custom_io to the sdp demuxer. During
the avformat_open_input call, the SDP is read from the AVFormatContext the avformat_open_input call, the SDP is read from the AVFormatContext
AVIOContext (ctx->pb) - after the avformat_open_input call, AVIOContext (ctx->pb) - after the avformat_open_input call,
during the av_read_frame() calls, the same ctx->pb is used for reading during the av_read_frame() calls, the same ctx->pb is used for reading
packets (and sending back RTCP RR packets). packets (and sending back RTCP RR packets).
Normally, one would use this with a read-only AVIOContext for the Normally, one would use this with a read-only AVIOContext for the
SDP during the avformat_open_input call, then close that one and SDP during the avformat_open_input call, then close that one and
replace it with a read-write one for the packets after the replace it with a read-write one for the packets after the
avformat_open_input call has returned. avformat_open_input call has returned.
This allows using the RTP depacketizers as "pure" demuxers, without This allows using the RTP depacketizers as "pure" demuxers, without
having them tied to the libavformat network IO. having them tied to the libavformat network IO.
*/ */
@ -316,7 +320,17 @@ static qboolean VARGS AVDec_DisplayFrame(void *vctx, qboolean nosound, qboolean
repainted = true; repainted = true;
} }
#if TARGET_FFMPEG
ctx->lasttime = av_frame_get_best_effort_timestamp(ctx->pVFrame); ctx->lasttime = av_frame_get_best_effort_timestamp(ctx->pVFrame);
#else
if(frameFinished)
{
if (ctx->pVFrame->pkt_pts != AV_NOPTS_VALUE)
ctx->lasttime = ctx->pVFrame->pkt_pts;
else
ctx->lasttime = ctx->pVFrame->pkt_dts;
}
#endif
} }
else if(packet.stream_index==ctx->audioStream && !nosound) else if(packet.stream_index==ctx->audioStream && !nosound)
{ {

View File

@ -7,9 +7,15 @@
#include "libswscale/swscale.h" #include "libswscale/swscale.h"
#include "libavutil/imgutils.h" #include "libavutil/imgutils.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
//#include <libavutil/channel_layout.h> #include "libavutil/channel_layout.h"
#define TARGET_FFMPEG (LIBAVFORMAT_VERSION_MICRO >= 100)
#if TARGET_FFMPEG
#define ENCODERNAME "ffmpeg" #define ENCODERNAME "ffmpeg"
#else
#define ENCODERNAME "libav"
#endif
#define HAVE_DECOUPLED_API (LIBAVCODEC_VERSION_MAJOR>57 || (LIBAVCODEC_VERSION_MAJOR==57&&LIBAVCODEC_VERSION_MINOR>=36)) #define HAVE_DECOUPLED_API (LIBAVCODEC_VERSION_MAJOR>57 || (LIBAVCODEC_VERSION_MAJOR==57&&LIBAVCODEC_VERSION_MINOR>=36))
@ -50,6 +56,15 @@ struct encctx
#define VARIABLE_AUDIO_FRAME_MIN_SIZE 512 //audio frames smaller than a certain size are just wasteful #define VARIABLE_AUDIO_FRAME_MIN_SIZE 512 //audio frames smaller than a certain size are just wasteful
#define VARIABLE_AUDIO_FRAME_MAX_SIZE 1024 #define VARIABLE_AUDIO_FRAME_MAX_SIZE 1024
#if !TARGET_FFMPEG
#define av_make_error_string qav_make_error_string
static inline char *av_make_error_string(char *errbuf, size_t errbuf_size, int errnum)
{
av_strerror(errnum, errbuf, errbuf_size);
return errbuf;
}
#endif
static void AVEnc_End (void *ctx); static void AVEnc_End (void *ctx);
static AVFrame *alloc_frame(enum AVPixelFormat pix_fmt, int width, int height) static AVFrame *alloc_frame(enum AVPixelFormat pix_fmt, int width, int height)
@ -61,14 +76,22 @@ static AVFrame *alloc_frame(enum AVPixelFormat pix_fmt, int width, int height)
picture = av_frame_alloc(); picture = av_frame_alloc();
if(!picture) if(!picture)
return NULL; return NULL;
#if TARGET_FFMPEG
size = av_image_get_buffer_size(pix_fmt, width, height, 1); size = av_image_get_buffer_size(pix_fmt, width, height, 1);
#else
size = avpicture_get_size(pix_fmt, width, height);
#endif
picture_buf = (uint8_t*)(av_malloc(size)); picture_buf = (uint8_t*)(av_malloc(size));
if (!picture_buf) if (!picture_buf)
{ {
av_free(picture); av_free(picture);
return NULL; return NULL;
} }
#if TARGET_FFMPEG
av_image_fill_arrays(picture->data, picture->linesize, picture_buf, pix_fmt, width, height, 1/*fixme: align*/); av_image_fill_arrays(picture->data, picture->linesize, picture_buf, pix_fmt, width, height, 1/*fixme: align*/);
#else
avpicture_fill((AVPicture*)picture, picture_buf, pix_fmt, width, height);
#endif
picture->width = width; picture->width = width;
picture->height = height; picture->height = height;
return picture; return picture;
@ -174,8 +197,8 @@ static void AVEnc_DoEncode(AVFormatContext *fc, AVStream *stream, AVFrame *frame
static void AVEnc_Video (void *vctx, int frameno, void *data, int bytestride, int width, int height, enum uploadfmt qpfmt) static void AVEnc_Video (void *vctx, int frameno, void *data, int bytestride, int width, int height, enum uploadfmt qpfmt)
{ {
struct encctx *ctx = vctx; struct encctx *ctx = vctx;
const uint8_t *srcslices[2]; const uint8_t *srcslices[4];
int srcstride[2]; int srcstride[4];
int avpfmt; int avpfmt;
if (!ctx->video_st) if (!ctx->video_st)
@ -185,8 +208,10 @@ static void AVEnc_Video (void *vctx, int frameno, void *data, int bytestride, in
{ {
case TF_BGRA32: avpfmt = AV_PIX_FMT_BGRA; break; case TF_BGRA32: avpfmt = AV_PIX_FMT_BGRA; break;
case TF_RGBA32: avpfmt = AV_PIX_FMT_RGBA; break; case TF_RGBA32: avpfmt = AV_PIX_FMT_RGBA; break;
#if TARGET_FFMPEG
case TF_BGRX32: avpfmt = AV_PIX_FMT_BGR0; break; case TF_BGRX32: avpfmt = AV_PIX_FMT_BGR0; break;
case TF_RGBX32: avpfmt = AV_PIX_FMT_RGB0; break; case TF_RGBX32: avpfmt = AV_PIX_FMT_RGB0; break;
#endif
case TF_BGR24: avpfmt = AV_PIX_FMT_BGR24; break; case TF_BGR24: avpfmt = AV_PIX_FMT_BGR24; break;
case TF_RGB24: avpfmt = AV_PIX_FMT_RGB24; break; case TF_RGB24: avpfmt = AV_PIX_FMT_RGB24; break;
default: default:
@ -198,7 +223,12 @@ static void AVEnc_Video (void *vctx, int frameno, void *data, int bytestride, in
srcstride[0] = bytestride; srcstride[0] = bytestride;
srcslices[1] = NULL; srcslices[1] = NULL;
srcstride[1] = 0; srcstride[1] = 0;
srcslices[2] = NULL; //libav's version probably needs this excess
srcstride[2] = 0;
srcslices[3] = NULL;
srcstride[3] = 0;
//fixme: it would be nice to avoid copies here if possible...
//convert RGB to whatever the codec needs (ie: yuv...). //convert RGB to whatever the codec needs (ie: yuv...).
//also rescales, but only if the user resizes the video while recording. which is a stupid thing to do. //also rescales, but only if the user resizes the video while recording. which is a stupid thing to do.
ctx->scale_ctx = sws_getCachedContext(ctx->scale_ctx, width, height, avpfmt, ctx->picture->width, ctx->picture->height, ctx->video_st->codec->pix_fmt, SWS_POINT, 0, 0, 0); ctx->scale_ctx = sws_getCachedContext(ctx->scale_ctx, width, height, avpfmt, ctx->picture->width, ctx->picture->height, ctx->video_st->codec->pix_fmt, SWS_POINT, 0, 0, 0);
@ -262,22 +292,6 @@ static AVStream *add_audio_stream(struct encctx *ctx, AVCodec *codec, int sample
c->time_base.den = samplerate; c->time_base.den = samplerate;
c->sample_rate = samplerate; c->sample_rate = samplerate;
c->channels = channels; c->channels = channels;
#if 0
switch(channels)
{
case 1:
c->channel_layout = AV_CH_LAYOUT_MONO;
break;
case 2:
c->channel_layout = AV_CH_LAYOUT_STEREO;
break;
default:
break;
}
#else
c->channel_layout = av_get_default_channel_layout(c->channels);
#endif
c->channel_layout = av_get_default_channel_layout(c->channels); c->channel_layout = av_get_default_channel_layout(c->channels);
c->sample_fmt = codec->sample_fmts[0]; c->sample_fmt = codec->sample_fmts[0];
@ -657,6 +671,7 @@ static void AVEnc_End (void *vctx)
#endif #endif
close_video(ctx); close_video(ctx);
close_audio(ctx);
//don't write trailers if this is an error case and we never even wrote the headers. //don't write trailers if this is an error case and we never even wrote the headers.
if (ctx->doneheaders) if (ctx->doneheaders)