summaryrefslogtreecommitdiff
path: root/community/dvdstyler
diff options
context:
space:
mode:
authorParabola <dev@list.parabolagnulinux.org>2011-11-02 13:41:57 +0000
committerParabola <dev@list.parabolagnulinux.org>2011-11-02 13:41:57 +0000
commit9343f37ee7ba1aa98f65272412d331a280890e12 (patch)
treea4bf1207d01a10e5cf246f1a4755086280f47b70 /community/dvdstyler
parent37a1064b8105764414f279ced442e6ba2f63bea1 (diff)
Wed Nov 2 13:41:53 UTC 2011
Diffstat (limited to 'community/dvdstyler')
-rw-r--r--community/dvdstyler/dvdstyler-ffmpeg.patch1915
1 files changed, 0 insertions, 1915 deletions
diff --git a/community/dvdstyler/dvdstyler-ffmpeg.patch b/community/dvdstyler/dvdstyler-ffmpeg.patch
deleted file mode 100644
index f2f56f6ff..000000000
--- a/community/dvdstyler/dvdstyler-ffmpeg.patch
+++ /dev/null
@@ -1,1915 +0,0 @@
-diff -Naur DVDStyler-1.8.4.3.orig/src/mediatrc_ffmpeg.cpp DVDStyler-1.8.4.3/src/mediatrc_ffmpeg.cpp
---- DVDStyler-1.8.4.3.orig/src/mediatrc_ffmpeg.cpp 2011-05-15 09:23:34.000000000 -0400
-+++ DVDStyler-1.8.4.3/src/mediatrc_ffmpeg.cpp 2011-09-18 18:13:03.000000000 -0400
-@@ -3,7 +3,7 @@
- // Purpose: FFMPEG Media Transcoder
- // Author: Alex Thuering
- // Created: 26.04.2008
--// RCS-ID: $Id: mediatrc_ffmpeg.cpp,v 1.33 2011/05/15 13:23:34 ntalex Exp $
-+// RCS-ID: $Id: mediatrc_ffmpeg.cpp,v 1.34 2011/07/24 07:58:21 ntalex Exp $
- // Copyright: (c) Alex Thuering
- // Licence: GPL
- /////////////////////////////////////////////////////////////////////////////
-@@ -17,21 +17,16 @@
- #include <math.h>
- #include <errno.h>
- extern "C" {
--#ifdef HAVE_FFMPEG_AVUTIL_H
--#include <opt.h>
--#include <swscale.h>
--#include <avutil.h>
--#include <fifo.h>
--#include <avfilter.h>
--#include <avfiltergraph.h>
--#else
--#include <libavcodec/opt.h>
--#include <libswscale/swscale.h>
-+#include <libavutil/opt.h>
- #include <libavutil/avutil.h>
- #include <libavutil/fifo.h>
-+#include <libavutil/dict.h>
-+#include <libavutil/pixdesc.h>
-+#include <libswscale/swscale.h>
-+#include <libavfilter/avcodec.h>
- #include <libavfilter/avfilter.h>
- #include <libavfilter/avfiltergraph.h>
--#endif
-+#include <libavfilter/vsink_buffer.h>
- }
-
- #define AUDIO_BUF_SIZE 50000
-@@ -48,101 +43,19 @@
- #define INT64_MAX INT64_C(9223372036854775807)
- #endif
-
--#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(52, 45, 0)
--#define av_guess_format guess_format
--#endif
--
--#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(52, 64, 0)
--#define AVMediaType CodecType
--#define AVMEDIA_TYPE_UNKNOWN CODEC_TYPE_UNKNOWN
--#define AVMEDIA_TYPE_VIDEO CODEC_TYPE_VIDEO
--#define AVMEDIA_TYPE_AUDIO CODEC_TYPE_AUDIO
--#define AVMEDIA_TYPE_DATA CODEC_TYPE_DATA
--#define AVMEDIA_TYPE_SUBTITLE CODEC_TYPE_SUBTITLE
--#define AVMEDIA_TYPE_ATTACHMENT CODEC_TYPE_ATTACHMENT
--#define AVMEDIA_TYPE_NB CODEC_TYPE_NB
-+#if LIBAVFORMAT_VERSION_INT < AV_VERSION_INT(53, 4, 0)
-+#define AVIO_FLAG_WRITE AVIO_WRONLY
- #endif
-
- //////////////////////////// AVAudioConvert /////////////////////////////////
--
--struct AVAudioConvert {
-- int in_channels, out_channels;
-- int fmt_pair;
--};
--
--AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels,
-- enum AVSampleFormat in_fmt, int in_channels,
-- const float *matrix, int flags) {
-- AVAudioConvert *ctx;
-- if (in_channels != out_channels)
-- return NULL;
-- ctx = (AVAudioConvert*) av_malloc(sizeof(AVAudioConvert));
-- if (!ctx)
-- return NULL;
-- ctx->in_channels = in_channels;
-- ctx->out_channels = out_channels;
-- ctx->fmt_pair = out_fmt + AV_SAMPLE_FMT_NB * in_fmt;
-- return ctx;
--}
--
--void av_audio_convert_free(AVAudioConvert *ctx) {
-- av_free(ctx);
--}
--
--int av_audio_convert(AVAudioConvert *ctx,
-- void * const out[6], const int out_stride[6],
-- const void * const in[6], const int in_stride[6], int len) {
-- int ch;
--
-- //FIXME optimize common cases
--
-- for (ch = 0; ch < ctx->out_channels; ch++) {
-- const int is = in_stride[ch];
-- const int os = out_stride[ch];
-- const uint8_t *pi = (const uint8_t *) in[ch];
-- uint8_t *po = (uint8_t *) out[ch];
-- uint8_t *end = po + os * len;
-- if (!out[ch])
-- continue;
--
--#define CONV(ofmt, otype, ifmt, expr)\
--if(ctx->fmt_pair == ofmt + AV_SAMPLE_FMT_NB*ifmt){\
-- do{\
-- *(otype*)po = expr; pi += is; po += os;\
-- }while(po < end);\
--}
--
--//FIXME put things below under ifdefs so we do not waste space for cases no codec will need
--//FIXME rounding ?
--
-- CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_U8 , *(const uint8_t*)pi)
-- else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<8)
-- else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)<<24)
-- else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7)))
-- else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_U8 , (*(const uint8_t*)pi - 0x80)*(1.0 / (1<<7)))
-- else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S16, (*(const int16_t*)pi>>8) + 0x80)
-- else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi)
-- else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S16, *(const int16_t*)pi<<16)
-- else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15)))
-- else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S16, *(const int16_t*)pi*(1.0 / (1<<15)))
-- else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_S32, (*(const int32_t*)pi>>24) + 0x80)
-- else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi>>16)
-- else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_S32, *(const int32_t*)pi)
-- else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1U<<31)))
-- else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_S32, *(const int32_t*)pi*(1.0 / (1U<<31)))
-- else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_FLT, av_clip_uint8( lrintf(*(const float*)pi * (1<<7)) + 0x80))
-- else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, av_clip_int16( lrintf(*(const float*)pi * (1<<15))))
-- else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, av_clipl_int32(llrintf(*(const float*)pi * (1U<<31))))
-- else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_FLT, *(const float*)pi)
-- else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_FLT, *(const float*)pi)
-- else CONV(AV_SAMPLE_FMT_U8 , uint8_t, AV_SAMPLE_FMT_DBL, av_clip_uint8( lrint(*(const double*)pi * (1<<7)) + 0x80))
-- else CONV(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, av_clip_int16( lrint(*(const double*)pi * (1<<15))))
-- else CONV(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, av_clipl_int32(llrint(*(const double*)pi * (1U<<31))))
-- else CONV(AV_SAMPLE_FMT_FLT, float , AV_SAMPLE_FMT_DBL, *(const double*)pi)
-- else CONV(AV_SAMPLE_FMT_DBL, double , AV_SAMPLE_FMT_DBL, *(const double*)pi)
-- else return -1;
-- }
-- return 0;
-+// audioconvert.h
-+extern "C" {
-+struct AVAudioConvert;
-+AVAudioConvert *av_audio_convert_alloc(enum AVSampleFormat out_fmt, int out_channels, enum AVSampleFormat in_fmt,
-+ int in_channels, const float *matrix, int flags);
-+void av_audio_convert_free(AVAudioConvert *ctx);
-+int av_audio_convert(AVAudioConvert *ctx, void * const out[6], const int out_stride[6], const void * const in[6],
-+ const int in_stride[6], int len);
- }
-
- //////////////////////////// AVOutputStream /////////////////////////////////
-@@ -161,6 +74,8 @@
- struct AVInputStream *sync_ist; /* input stream to sync against */
- int64_t sync_opts; /* output frame counter, could be changed to some true timestamp *///FIXME look at frame_number
- AVBitStreamFilterContext *bitstream_filters;
-+ AVCodec *enc;
-+
- /* video only */
- int video_resample;
- AVFrame resample_frame; /* temporary frame for image resampling */
-@@ -168,17 +83,19 @@
- int resample_height;
- int resample_width;
- int resample_pix_fmt;
-+ AVRational frame_rate;
-
- float frame_aspect_ratio;
-+
- /* forced key frames */
--// int64_t *forced_kf_pts;
--// int forced_kf_count;
--// int forced_kf_index;
-+ int64_t *forced_kf_pts;
-+ int forced_kf_count;
-+ int forced_kf_index;
-
- /* audio only */
- int audio_resample;
- ReSampleContext *resample; /* for audio resampling */
-- int resample_sample_fmt;
-+ AVSampleFormat resample_sample_fmt;
- int resample_channels;
- int resample_sample_rate;
- int reformat_pair;
-@@ -216,94 +133,22 @@
- } AVInputStream;
-
- typedef struct AVInputFile {
-+ AVFormatContext *ctx;
- int eof_reached; /* true if eof reached */
- int ist_index; /* index of first stream in ist_table */
- int buffer_size; /* current total buffer size */
-- int nb_streams; /* nb streams we are aware of */
- } AVInputFile;
-
--//#include <libavfilter/vsrc_buffer.h>
--extern "C" {
-- int av_vsrc_buffer_add_frame2(AVFilterContext *buffer_filter, AVFrame *frame, int64_t pts,
-- AVRational pixel_aspect, int width, int height, enum PixelFormat pix_fmt, const char *sws_param);
--}
--
--//#include "cmdutils.h"
--typedef struct {
-- enum PixelFormat pix_fmt;
--} FFSinkContext;
--
--int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque)
-+static int configure_video_filters(AVInputStream *ist, AVOutputStream *ost)
- {
-- FFSinkContext *priv = (FFSinkContext*) ctx->priv;
--
-- if (!opaque)
-- return AVERROR(EINVAL);
-- *priv = *(FFSinkContext *)opaque;
--
-- return 0;
--}
--
--void null_end_frame(AVFilterLink *inlink) { }
--
--int ffsink_query_formats(AVFilterContext *ctx) {
-- FFSinkContext *priv = (FFSinkContext*) ctx->priv;
-- int pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE };
--
-- avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts));
-- return 0;
--}
--
--int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame, AVFilterBufferRef **picref_ptr, AVRational *tb) {
-- int ret;
-- AVFilterBufferRef *picref;
--
-- if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0)
-- return ret;
-- if (!(picref = ctx->inputs[0]->cur_buf))
-- return AVERROR(ENOENT);
-- *picref_ptr = picref;
-- ctx->inputs[0]->cur_buf = NULL;
-- *tb = ctx->inputs[0]->time_base;
--
-- memcpy(frame->data, picref->data, sizeof(frame->data));
-- memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize));
-- frame->interlaced_frame = picref->video->interlaced;
-- frame->top_field_first = picref->video->top_field_first;
--
-- return 1;
--}
--
--AVFilter ffsink;
--AVFilterPad fInputs[2];
--AVFilterPad fOutputs[1];
--
--int configure_filters(AVInputStream *ist, AVOutputStream *ost) {
- AVFilterContext *last_filter, *filter;
- /** filter graph containing all filters including input & output */
- AVCodecContext *codec = ost->st->codec;
- AVCodecContext *icodec = ist->st->codec;
-- FFSinkContext ffsink_ctx;
-- ffsink_ctx.pix_fmt = codec->pix_fmt;
-+ enum PixelFormat pix_fmts[] = { codec->pix_fmt, PIX_FMT_NONE };
- AVRational sample_aspect_ratio;
- char args[255];
- int ret;
--
-- ffsink.name = "ffsink";
-- ffsink.priv_size = sizeof(FFSinkContext);
-- ffsink.init = ffsink_init;
-- ffsink.query_formats = ffsink_query_formats;
--
-- fInputs[0].name = "default";
-- fInputs[0].type = AVMEDIA_TYPE_VIDEO;
-- fInputs[0].end_frame = null_end_frame;
-- fInputs[0].min_perms = AV_PERM_READ;
-- fInputs[1].name = NULL;
-- ffsink.inputs = fInputs;
-- fOutputs[0].name = NULL;
-- ffsink.outputs = fOutputs;
--
-- int sws_flags = SWS_BICUBIC;
-
- ost->graph = avfilter_graph_alloc();
-
-@@ -320,8 +165,8 @@
- "src", args, NULL, ost->graph);
- if (ret < 0)
- return ret;
-- ret = avfilter_graph_create_filter(&ost->output_video_filter, &ffsink,
-- "out", NULL, &ffsink_ctx, ost->graph);
-+ ret = avfilter_graph_create_filter(&ost->output_video_filter, avfilter_get_by_name("buffersink"),
-+ "out", NULL, pix_fmts, ost->graph);
- if (ret < 0)
- return ret;
- last_filter = ost->input_video_filter;
-@@ -330,7 +175,7 @@
- snprintf(args, 255, "%d:%d:flags=0x%X",
- codec->width,
- codec->height,
-- sws_flags);
-+ ost->sws_flags);
- if ((ret = avfilter_graph_create_filter(&filter, avfilter_get_by_name("scale"),
- NULL, args, NULL, ost->graph)) < 0)
- return ret;
-@@ -339,12 +184,12 @@
- last_filter = filter;
- }
-
-- snprintf(args, sizeof(args), "flags=0x%X", sws_flags);
-+ snprintf(args, sizeof(args), "flags=0x%X", ost->sws_flags);
- ost->graph->scale_sws_opts = av_strdup(args);
-
- if (ost->avfilter) {
-- AVFilterInOut* outputs = (AVFilterInOut*) av_malloc(sizeof(AVFilterInOut));
-- AVFilterInOut* inputs = (AVFilterInOut*) av_malloc(sizeof(AVFilterInOut));
-+ AVFilterInOut *outputs = avfilter_inout_alloc();
-+ AVFilterInOut *inputs = avfilter_inout_alloc();
-
- outputs->name = av_strdup("in");
- outputs->filter_ctx = last_filter;
-@@ -356,7 +201,7 @@
- inputs->pad_idx = 0;
- inputs->next = NULL;
-
-- if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, inputs, outputs, NULL)) < 0)
-+ if ((ret = avfilter_graph_parse(ost->graph, ost->avfilter, &inputs, &outputs, NULL)) < 0)
- return ret;
- av_freep(&ost->avfilter);
- } else {
-@@ -370,8 +215,10 @@
- codec->width = ost->output_video_filter->inputs[0]->w;
- codec->height = ost->output_video_filter->inputs[0]->h;
- codec->sample_aspect_ratio = ost->st->sample_aspect_ratio =
-+ ost->frame_aspect_ratio ? // overriden by the -aspect cli option
-+ av_d2q(ost->frame_aspect_ratio*codec->height/codec->width, 255) :
- ost->output_video_filter->inputs[0]->sample_aspect_ratio;
--
-+
- return 0;
- }
-
-@@ -412,12 +259,11 @@
- }
-
- wxFfmpegMediaTranscoder::wxFfmpegMediaTranscoder(int threadCount) {
-- nb_input_files = 0;
- input_files_ts_scale[0] = NULL;
- nb_input_files_ts_scale[0] = 0;
-- output_codecs = NULL;
-+ input_codecs = NULL;
-+ nb_input_codecs = 0;
- nb_output_files = 0;
-- nb_output_codecs = 0;
- stream_maps = NULL;
- nb_stream_maps = 0;
- nb_meta_data_maps = 0;
-@@ -429,7 +275,6 @@
- frame_width = 0;
- frame_height = 0;
- frame_aspect_ratio = 0;
-- frame_aspect_ratio_override = 0;
- frame_pix_fmt = PIX_FMT_NONE;
- frame_bits_per_raw_sample = 0;
- audio_sample_fmt = SAMPLE_FMT_NONE;
-@@ -476,12 +321,12 @@
- do_psnr = 0;
- do_pass = 0;
- pass_logfilename_prefix = "ffmpeg2pass";
-- video_sync_method= -1;
-- audio_sync_method= 0;
-- audio_drift_threshold= 0.1;
-- copy_ts= 0;
-- opt_shortest = 0; //
-- video_global_header = 0;
-+ video_sync_method = -1;
-+ audio_sync_method = 0;
-+ audio_drift_threshold = 0.1;
-+ copy_ts = 0;
-+ copy_tb = 0;
-+ opt_shortest = 0;
- vstats_filename = NULL;
- vstats_file = NULL;
- opt_programid = 0;
-@@ -519,6 +364,11 @@
- audio_bitstream_filters = NULL;
- subtitle_bitstream_filters = NULL;
-
-+ input_streams = NULL;
-+ nb_input_streams = 0;
-+ input_files = NULL;
-+ nb_input_files = 0;
-+
- av_log_set_callback(&av_log_wxLog_callback);
- }
-
-@@ -531,20 +381,39 @@
- avfilter_register_all();
- }
-
-+// similar to ff_dynarray_add() and av_fast_realloc()
-+void* grow_array(void *array, int elem_size, int *size, int new_size) {
-+ if (new_size >= INT_MAX / elem_size) {
-+ wxLogError(wxT("Array too big."));
-+ return NULL;
-+ }
-+ if (*size < new_size) {
-+ uint8_t* tmp = (uint8_t*) av_realloc(array, new_size*elem_size);
-+ if (!tmp) {
-+ wxLogError(wxT("Could not alloc buffer."));
-+ return NULL;
-+ }
-+ memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
-+ *size = new_size;
-+ return tmp;
-+ }
-+ return array;
-+}
-+
- bool wxFfmpegMediaTranscoder::AddInputFile(const wxString& fileName, bool disableVideo, bool disableAudio,
- bool disableSubtitle) {
- AVFormatContext *ic;
- int err, i, ret, rfps, rfps_base;
- int64_t timestamp;
--
-+
- /* get default parameters from command line */
- ic = avformat_alloc_context();
- if (!ic) {
- PrintError(fileName, AVERROR(ENOMEM));
- return false;
- }
-- ic->flags |= AVFMT_FLAG_NONBLOCK;
--
-+ ic->flags |= AVFMT_FLAG_NONBLOCK | AVFMT_FLAG_PRIV_OPT;
-+
- // open the input file with generic libav function
- err = av_open_input_file(&ic, (const char*) fileName.mb_str(), NULL, 0, NULL);
- if (err < 0) {
-@@ -606,39 +475,38 @@
- for (i=0; i<(int)ic->nb_streams; i++) {
- AVStream *st = ic->streams[i];
- AVCodecContext *dec = st->codec;
-+ AVInputStream *ist;
-+
- dec->thread_count = thread_count;
-+ input_codecs = (AVCodec**) grow_array(input_codecs, sizeof(*input_codecs), &nb_input_codecs, nb_input_codecs + 1);
-+
-+ input_streams = (AVInputStream*) grow_array(input_streams, sizeof(*input_streams), &nb_input_streams, nb_input_streams + 1);
-+ ist = &input_streams[nb_input_streams - 1];
-+ ist->st = st;
-+ ist->file_index = nb_input_files;
-+ ist->discard = 1;
-+
- switch (dec->codec_type) {
- case AVMEDIA_TYPE_AUDIO:
-+ input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
- channel_layout = dec->channel_layout;
-- audio_channels = dec->channels;
-- audio_sample_rate = dec->sample_rate;
- audio_sample_fmt = dec->sample_fmt;
- if (disableAudio)
- st->discard = AVDISCARD_ALL;
-- /* Note that av_find_stream_info can add more streams, and we
-- * currently have no chance of setting up lowres decoding
-- * early enough for them. */
-- if (dec->lowres)
-- audio_sample_rate >>= dec->lowres;
- break;
- case AVMEDIA_TYPE_VIDEO:
-- frame_height = dec->height;
-- frame_width = dec->width;
-+ input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
- if(st->sample_aspect_ratio.num)
- frame_aspect_ratio=av_q2d(st->sample_aspect_ratio);
- else
- frame_aspect_ratio=av_q2d(dec->sample_aspect_ratio);
- frame_aspect_ratio *= (float) dec->width / dec->height;
-- frame_aspect_ratio_override = 0;
-- frame_pix_fmt = dec->pix_fmt;
- rfps = st->r_frame_rate.num;
- rfps_base = st->r_frame_rate.den;
-- if(dec->lowres) {
-+ if (dec->lowres) {
- dec->flags |= CODEC_FLAG_EMU_EDGE;
-- frame_height >>= dec->lowres;
-- frame_width >>= dec->lowres;
-- dec->height = frame_height;
-- dec->width = frame_width;
-+ dec->height >>= dec->lowres;
-+ dec->width >>= dec->lowres;
- }
- if (me_threshold)
- dec->debug |= FF_DEBUG_MV;
-@@ -650,9 +518,6 @@
- i, (float)dec->time_base.den / dec->time_base.num, dec->time_base.den, dec->time_base.num,
- (float)rfps / rfps_base, rfps, rfps_base);
- }
-- /* update the current frame rate to match the stream frame rate */
-- frame_rate.num = rfps;
-- frame_rate.den = rfps_base;
-
- if (disableVideo)
- st->discard = AVDISCARD_ALL;
-@@ -660,6 +525,7 @@
- case AVMEDIA_TYPE_DATA:
- break;
- case AVMEDIA_TYPE_SUBTITLE:
-+ input_codecs[nb_input_codecs-1] = avcodec_find_decoder(dec->codec_id);
- if (disableSubtitle)
- st->discard = AVDISCARD_ALL;
- break;
-@@ -672,17 +538,26 @@
- }
- }
-
-- input_files[nb_input_files] = ic;
- input_files_ts_offset[nb_input_files] = input_ts_offset - (copy_ts ? 0 : timestamp);
- /* dump the file content */
- if (verbose >= 0)
- av_dump_format(ic, nb_input_files, (const char*)fileName.mb_str(), 0);
-
-- nb_input_files++;
-+ input_files = (AVInputFile*) grow_array(input_files, sizeof(*input_files), &nb_input_files, nb_input_files + 1);
-+ input_files[nb_input_files - 1].ctx = ic;
-+ input_files[nb_input_files - 1].ist_index = nb_input_streams - ic->nb_streams;
-+
- input_files_ts_scale[nb_input_files] = NULL;
- nb_input_files_ts_scale[nb_input_files] = 0;
--
-+
-+ top_field_first = -1;
- video_channel = 0;
-+ frame_rate = (AVRational){0, 0};
-+ frame_pix_fmt = PIX_FMT_NONE;
-+ frame_height = 0;
-+ frame_width = 0;
-+ audio_sample_rate = 0;
-+ audio_channels = 0;
- return true;
- }
-
-@@ -742,27 +617,27 @@
-
- oc->timestamp = recording_timestamp;
-
-- av_metadata_copy(&oc->metadata, metadata, 0);
-- av_metadata_free(&metadata);
--
-+ av_dict_copy(&oc->metadata, metadata, 0);
-+ av_dict_free(&metadata);
-+
- output_files[nb_output_files++] = oc;
-
- /* check filename in case of an image number is expected */
- if (oc->oformat->flags & AVFMT_NEEDNUMBER) {
- if (!av_filename_number_test(oc->filename)) {
-- PrintError(fileName, AVERROR_NUMEXPECTED);
-+ PrintError(fileName, AVERROR(EINVAL));
- return false;
- }
- }
-
- /* test if it already exists to avoid loosing precious files */
-- if (url_exist((const char*) fileName.mb_str())) {
-+ if (avio_check((const char*) fileName.mb_str(), 0) == 0) {
- wxLogError(wxT("File '%s' already exists"), fileName.c_str());
- return false;
- }
-
- /* open the file */
-- int err = avio_open(&oc->pb, (const char*) fileName.mb_str(), URL_WRONLY);
-+ int err = avio_open(&oc->pb, (const char*) fileName.mb_str(), AVIO_FLAG_WRITE);
- if (err < 0) {
- PrintError(fileName, err);
- return false;
-@@ -777,39 +652,24 @@
- oc->preload= (int)(mux_preload*AV_TIME_BASE);
- oc->max_delay= (int)(mux_max_delay*AV_TIME_BASE);
- oc->loop_output = loop_output;
-- oc->flags |= AVFMT_FLAG_NONBLOCK;
--
-+
-+ frame_rate = (AVRational){0, 0};
-+ frame_width = 0;
-+ frame_height = 0;
-+ audio_sample_rate = 0;
-+ audio_channels = 0;
-+
- return true;
- }
-
- void wxFfmpegMediaTranscoder::PrintError(const wxString& msg, int err) {
-- switch (err) {
-- case AVERROR_NUMEXPECTED:
-- wxLogError(wxT("%s: Incorrect image filename syntax.\n"
-- "Use '%%d' to specify the image number:\n"
-- " for img1.jpg, img2.jpg, ..., use 'img%%d.jpg';\n"
-- " for img001.jpg, img002.jpg, ..., use 'img%%03d.jpg'."), msg.c_str());
-- break;
-- case AVERROR_INVALIDDATA:
-- wxLogError(wxT("%s: Error while parsing header"), msg.c_str());
-- break;
-- case AVERROR_NOFMT:
-- wxLogError(wxT("%s: Unknown format"), msg.c_str());
-- break;
-- case AVERROR(EIO):
-- wxLogError(wxT("%s: I/O error occured\n"
-- "Usually that means that input file is truncated and/or corrupted."), msg.c_str());
-- break;
-- case AVERROR(ENOMEM):
-- wxLogError(wxT("%s: memory allocation error occured"), msg.c_str());
-- break;
-- case AVERROR(ENOENT):
-- wxLogError(wxT("%s: no such file or directory"), msg.c_str());
-- break;
-- default:
-- wxLogError(wxT("%s: Error while opening file"), msg.c_str());
-- break;
-- }
-+ char errbuf[128];
-+ const char *errbuf_ptr = errbuf;
-+
-+ if (av_strerror(err, errbuf, sizeof(errbuf)) < 0)
-+ errbuf_ptr = strerror(AVUNERROR(err));
-+ wxString errorStr(errbuf_ptr, wxConvUTF8);
-+ wxLogError(msg + wxT(": ") + errorStr);
- }
-
- void choose_pixel_fmt(AVStream *st, AVCodec *codec) {
-@@ -819,12 +679,15 @@
- if(*p == st->codec->pix_fmt)
- break;
- }
-- if(*p == -1
-- && !( st->codec->codec_id==CODEC_ID_MJPEG
-- && st->codec->strict_std_compliance <= FF_COMPLIANCE_INOFFICIAL
-- && ( st->codec->pix_fmt == PIX_FMT_YUV420P
-- || st->codec->pix_fmt == PIX_FMT_YUV422P)))
-+ if (*p == -1) {
-+ if(st->codec->pix_fmt != PIX_FMT_NONE)
-+ av_log(NULL, AV_LOG_WARNING,
-+ "Incompatible pixel format '%s' for codec '%s', auto-selecting format '%s'\n",
-+ av_pix_fmt_descriptors[st->codec->pix_fmt].name,
-+ codec->name,
-+ av_pix_fmt_descriptors[codec->pix_fmts[0]].name);
- st->codec->pix_fmt = codec->pix_fmts[0];
-+ }
- }
- }
-
-@@ -835,30 +698,20 @@
- if(*p == st->codec->sample_fmt)
- break;
- }
-- if (*p == -1)
-+ if (*p == -1) {
-+ if ((codec->capabilities & CODEC_CAP_LOSSLESS)
-+ && av_get_sample_fmt_name(st->codec->sample_fmt) > av_get_sample_fmt_name(codec->sample_fmts[0]))
-+ av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");
-+ av_log(NULL, AV_LOG_WARNING,
-+ "Incompatible sample format '%s' for codec '%s', auto-selecting format '%s'\n",
-+ av_get_sample_fmt_name(st->codec->sample_fmt),
-+ codec->name,
-+ av_get_sample_fmt_name(codec->sample_fmts[0]));
- st->codec->sample_fmt = codec->sample_fmts[0];
-+ }
- }
- }
-
--// similar to ff_dynarray_add() and av_fast_realloc()
--void* grow_array(void *array, int elem_size, int *size, int new_size) {
-- if (new_size >= INT_MAX / elem_size) {
-- wxLogError(wxT("Array too big."));
-- return NULL;
-- }
-- if (*size < new_size) {
-- uint8_t* tmp = (uint8_t*) av_realloc(array, new_size*elem_size);
-- if (!tmp) {
-- wxLogError(wxT("Could not alloc buffer."));
-- return NULL;
-- }
-- memset(tmp + *size*elem_size, 0, (new_size-*size) * elem_size);
-- *size = new_size;
-- return tmp;
-- }
-- return array;
--}
--
- void choose_sample_rate(AVStream *st, AVCodec *codec) {
- if (codec && codec->supported_samplerates){
- const int *p= codec->supported_samplerates;
-@@ -893,6 +746,8 @@
- }
- ost->file_index = fileIdx;
- ost->index = idx;
-+
-+ ost->sws_flags = SWS_BICUBIC;
- return ost;
- }
-
-@@ -913,8 +768,6 @@
- if (!ost)
- return false;
-
-- output_codecs = (AVCodec**)
-- grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
- if (videoFormat != vfCOPY) {
- wxSize frameSize = GetFrameSize(videoFormat);
- frame_width = frameSize.GetWidth();
-@@ -929,21 +782,13 @@
- frame_rate.den = 1001;
- }
- codec = avcodec_find_encoder(codecId);
-- output_codecs[nb_output_codecs-1] = codec;
-+ ost->enc = codec;
-
- char* vfilters = NULL;
- if (m_videoFilters.length()) {
- vfilters = (char*) av_realloc(vfilters, m_videoFilters.length() + 1);
- snprintf(vfilters, m_videoFilters.length() + 1, "%s", (const char*) m_videoFilters.mb_str());
- }
-- if (frame_aspect_ratio_override) {
-- int i = vfilters ? strlen(vfilters) : 0;
-- vfilters = (char*) av_realloc(vfilters, i + 100);
-- snprintf(vfilters + i, 100, "%csetdar=%f", i ? ',' : ' ', frame_aspect_ratio);
-- frame_aspect_ratio = 0;
-- frame_aspect_ratio_override = 0;
-- }
--
- ost->avfilter = vfilters;
- }
-
-@@ -954,17 +799,14 @@
- st->codec->thread_count = thread_count;
-
- video_enc = st->codec;
--
-+
- if (video_codec_tag)
- video_enc->codec_tag= video_codec_tag;
--
-- if ((video_global_header&1) || (video_global_header==0 && (oc->oformat->flags & AVFMT_GLOBALHEADER))) {
-+
-+ if (oc->oformat->flags & AVFMT_GLOBALHEADER) {
- video_enc->flags |= CODEC_FLAG_GLOBAL_HEADER;
- }
-- if (video_global_header&2) {
-- video_enc->flags2 |= CODEC_FLAG2_LOCAL_HEADER;
-- }
--
-+
- if (videoFormat == vfCOPY) {
- st->stream_copy = 1;
- video_enc->codec_type = AVMEDIA_TYPE_VIDEO;
-@@ -974,8 +816,6 @@
- const char *p;
- int i;
-
-- AVRational fps= frame_rate.num ? frame_rate : (AVRational) {25,1};
--
- av_set_int(video_enc, "gop", isNTSC(videoFormat) ? 15 : 12);
- av_set_int(video_enc, "b", bitrate * 1000);
- av_set_int(video_enc, "maxrate", vbr ? 9000000 : bitrate * 1000);
-@@ -985,20 +825,16 @@
- av_set_int(video_enc, "packetsize", 2048);
- av_set_int(video_enc, "muxrate", 10080000);
-
-+ if (frame_rate.num)
-+ ost->frame_rate = frame_rate;
- video_enc->codec_id = codecId;
-
-- if (codec && codec->supported_framerates && !force_fps)
-- fps = codec->supported_framerates[av_find_nearest_q_idx(fps, codec->supported_framerates)];
-- video_enc->time_base.den = fps.num;
-- video_enc->time_base.num = fps.den;
- video_enc->width = frame_width;
- video_enc->height = frame_height;
- video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*frame_height/frame_width, 255);
- video_enc->pix_fmt = frame_pix_fmt;
- st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
--
-- choose_pixel_fmt(st, codec);
--
-+
- if (intra_only)
- video_enc->gop_size = 0;
- if (video_qscale || same_quality) {
-@@ -1059,7 +895,7 @@
- // parse_forced_key_frames(forced_key_frames, ost, video_enc);
- }
- if (video_language) {
-- av_metadata_set2(&st->metadata, "language", video_language, 0);
-+ av_dict_set(&st->metadata, "language", video_language, 0);
- av_freep(&video_language);
- }
-
-@@ -1084,12 +920,10 @@
- if (!ost)
- return false;
-
-- output_codecs = (AVCodec**)
-- grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
- if (audioFormat != afNONE && audioFormat != afCOPY) {
- codecId = audioFormat == afMP2 ? CODEC_ID_MP2 : CODEC_ID_AC3;
- codec = avcodec_find_encoder(codecId);
-- output_codecs[nb_output_codecs-1] = codec;
-+ ost->enc = codec;
- }
-
- audio_sample_rate = 48000;
-@@ -1110,8 +944,6 @@
- }
- if (audioFormat == afCOPY) {
- st->stream_copy = 1;
-- audio_enc->channels = audio_channels;
-- audio_enc->sample_rate = audio_sample_rate;
- } else {
- av_set_int(audio_enc, "ab", bitrate*1000);
- codec = avcodec_find_encoder(codecId);
-@@ -1122,19 +954,16 @@
- st->quality = FF_QP2LAMBDA * audio_qscale;
- audio_enc->global_quality = (int) st->quality;
- }
-- audio_enc->channels = audio_channels;
-+ if (audio_channels)
-+ audio_enc->channels = audio_channels;
- audio_enc->sample_fmt = audio_sample_fmt;
-- audio_enc->sample_rate = audio_sample_rate;
-+ if (audio_sample_rate)
-+ audio_enc->sample_rate = audio_sample_rate;
- audio_enc->channel_layout = channel_layout;
-- if (av_get_channel_layout_nb_channels(channel_layout) != audio_channels)
-- audio_enc->channel_layout = 0;
- choose_sample_fmt(st, codec);
-- choose_sample_rate(st, codec);
- }
-- audio_enc->sample_rate = audio_sample_rate;
-- audio_enc->time_base= (AVRational) {1, audio_sample_rate};
- if (audio_language) {
-- av_metadata_set2(&st->metadata, "language", audio_language, 0);
-+ av_dict_set(&st->metadata, "language", audio_language, 0);
- av_freep(&audio_language);
- }
-
-@@ -1158,11 +987,10 @@
- return false;
- subtitle_enc = st->codec;
-
-- output_codecs = (AVCodec**)
-- grow_array(output_codecs, sizeof(*output_codecs), &nb_output_codecs, nb_output_codecs + 1);
- if (subtitleFormat != sfNONE) {
- codecId = CODEC_ID_DVD_SUBTITLE;
-- codec = output_codecs[nb_output_codecs-1] = avcodec_find_encoder(codecId);
-+ codec = avcodec_find_encoder(codecId);
-+ ost->enc = codec;
- }
- avcodec_get_context_defaults3(st->codec, codec);
-
-@@ -1181,7 +1009,7 @@
- }
-
- if (subtitle_language) {
-- av_metadata_set2(&st->metadata, "language", subtitle_language, 0);
-+ av_dict_set(&st->metadata, "language", subtitle_language, 0);
- av_freep(&subtitle_language);
- }
-
-@@ -1233,7 +1061,7 @@
- }
-
- int wxFfmpegMediaTranscoder::CopyChapters(int infile, int outfile) {
-- AVFormatContext *is = input_files[infile];
-+ AVFormatContext *is = input_files[infile].ctx;
- AVFormatContext *os = output_files[outfile];
-
- for (unsigned int i = 0; i < is->nb_chapters; i++) {
-@@ -1259,7 +1087,7 @@
- out_ch->end = FFMIN(rt, in_ch->end - ts_off);
-
- if (metadata_chapters_autocopy)
-- av_metadata_copy(&out_ch->metadata, in_ch->metadata, 0);
-+ av_dict_copy(&out_ch->metadata, in_ch->metadata, 0);
-
- os->nb_chapters++;
- os->chapters = (AVChapter**) av_realloc(os->chapters, sizeof(AVChapter)*os->nb_chapters);
-@@ -1272,11 +1100,11 @@
-
- /** Starts transcoding. */
- bool wxFfmpegMediaTranscoder::Run(bool& canceled) {
-- int ret = 0, i, j, k, n, nb_istreams = 0, nb_ostreams = 0, step;
-+ int ret = 0, i, j, k, n, nb_ostreams = 0, step;
- AVFormatContext *is, *os;
- AVCodecContext *codec, *icodec;
- AVOutputStream *ost, **ost_table= NULL;
-- AVInputStream *ist, **ist_table= NULL;
-+ AVInputStream *ist = NULL;
- wxString error;
- int want_sdp = 1;
- int bit_buffer_size = 1024*256;
-@@ -1289,46 +1117,10 @@
- if (canceled)
- return false;
-
-- AVInputFile* file_table = (AVInputFile*) av_mallocz(nb_input_files*sizeof(AVInputFile));
-- if (!file_table)
-- goto fail;
--
-- /* input stream init */
-- j = 0;
-- for (i=0; i<nb_input_files; i++) {
-- is = input_files[i];
-- file_table[i].ist_index = j;
-- file_table[i].nb_streams = is->nb_streams;
-- j += is->nb_streams;;
-- }
-- nb_istreams = j;
--
-- ist_table = (AVInputStream**) av_mallocz(nb_istreams * sizeof(AVInputStream *));
-- if (!ist_table)
-- goto fail;
--
-- for (i=0; i<nb_istreams; i++) {
-- ist = (AVInputStream*) av_mallocz(sizeof(AVInputStream));
-- if (!ist)
-- goto fail;
-- ist_table[i] = ist;
-- }
-- j = 0;
-- for (i=0; i<nb_input_files; i++) {
-- is = input_files[i];
-- for (k=0; k<(int)is->nb_streams; k++) {
-- ist = ist_table[j++];
-- ist->st = is->streams[k];
-- ist->file_index = i;
-- ist->index = k;
-- ist->discard = 1; /* the stream is discarded by default (changed later) */
--
-- if (rate_emu) {
-- ist->start = av_gettime();
-- }
-- }
-- }
--
-+ if (rate_emu)
-+ for (i = 0; i < nb_input_streams; i++)
-+ input_streams[i].start = av_gettime();
-+
- /* output stream init */
- nb_ostreams = 0;
- for (i=0; i<nb_output_files; i++) {
-@@ -1350,15 +1142,15 @@
- int fi = stream_maps[i].file_index;
- int si = stream_maps[i].stream_index;
-
-- if (fi < 0 || fi > nb_input_files - 1 ||
-- si < 0 || si > file_table[fi].nb_streams - 1) {
-+ if (fi < 0 || fi > (int) nb_input_files - 1 ||
-+ si < 0 || si > (int) input_files[fi].ctx->nb_streams - 1) {
- wxLogError(wxT("Could not find input stream #%d.%d"), fi, si);
- return false;
- }
- fi = stream_maps[i].sync_file_index;
- si = stream_maps[i].sync_stream_index;
- if (fi < 0 || fi> nb_input_files - 1 ||
-- si < 0 || si> file_table[fi].nb_streams - 1) {
-+ si < 0 || si > (int) input_files[fi].ctx->nb_streams - 1) {
- wxLogError(wxT("Could not find sync stream #%d.%d"), fi, si);
- return false;
- }
-@@ -1379,11 +1171,11 @@
- for(j=0; j<AVMEDIA_TYPE_NB; j++)
- nb_frame_threshold[j] += step;
-
-- for(j=0; j<nb_istreams; j++) {
-+ for(j=0; j<nb_input_streams; j++) {
- int skip=0;
-- ist = ist_table[j];
-+ ist = &input_streams[j];
- if(opt_programid){
-- AVFormatContext *f= input_files[ ist->file_index ];
-+ AVFormatContext *f= input_files[ist->file_index].ctx;
- skip=1;
- for (unsigned int pi=0; pi<f->nb_programs; pi++) {
- AVProgram *p= f->programs[pi];
-@@ -1411,11 +1203,11 @@
- ost = ost_table[n] = output_streams_for_file[k][i];
- ost->st = os->streams[i];
- if (nb_stream_maps > 0) {
-- ost->source_index = file_table[stream_maps[n].file_index].ist_index +
-+ ost->source_index = input_files[stream_maps[n].file_index].ist_index +
- stream_maps[n].stream_index;
-
- /* Sanity check that the stream types match */
-- if (ist_table[ost->source_index]->st->codec->codec_type
-+ if (input_streams[ost->source_index].st->codec->codec_type
- != ost->st->codec->codec_type) {
- wxLogError(wxT("Codec type mismatch for mapping #%d.%d -> #%d.%d"),
- stream_maps[n].file_index, stream_maps[n].stream_index,
-@@ -1426,12 +1218,12 @@
- } else {
- /* get corresponding input stream index : we select the first one with the right type */
- found = 0;
-- for(j=0;j<nb_istreams;j++) {
-+ for (j=0; j < nb_input_streams; j++) {
- int skip=0;
-- ist = ist_table[j];
-+ ist = &input_streams[j];
- if(opt_programid){
- unsigned int pi,si;
-- AVFormatContext *f= input_files[ ist->file_index ];
-+ AVFormatContext *f = input_files[ist->file_index].ctx;
- skip=1;
- for(pi=0; pi<f->nb_programs; pi++){
- AVProgram *p= f->programs[pi];
-@@ -1453,8 +1245,8 @@
- if (!found) {
- if(! opt_programid) {
- /* try again and reuse existing stream */
-- for(j=0;j<nb_istreams;j++) {
-- ist = ist_table[j];
-+ for (j = 0; j < nb_input_streams; j++) {
-+ ist = &input_streams[j];
- if ( ist->st->codec->codec_type == ost->st->codec->codec_type
- && ist->st->discard != AVDISCARD_ALL) {
- ost->source_index = j;
-@@ -1471,10 +1263,10 @@
- }
- }
- }
-- ist = ist_table[ost->source_index];
-+ ist = &input_streams[ost->source_index];
- ist->discard = 0;
- ost->sync_ist = (nb_stream_maps > 0) ?
-- ist_table[file_table[stream_maps[n].sync_file_index].ist_index +
-+ &input_streams[input_files[stream_maps[n].sync_file_index].ist_index +
- stream_maps[n].sync_stream_index] : ist;
- }
- }
-@@ -1483,13 +1275,13 @@
- for (i=0; i<nb_ostreams; i++) {
- ost = ost_table[i];
- os = output_files[ost->file_index];
-- ist = ist_table[ost->source_index];
-+ ist = &input_streams[ost->source_index];
-
- codec = ost->st->codec;
- icodec = ist->st->codec;
-
- if (metadata_streams_autocopy)
-- av_metadata_copy(&ost->st->metadata, ist->st->metadata, AV_METADATA_DONT_OVERWRITE);
-+ av_dict_copy(&ost->st->metadata, ist->st->metadata, AV_DICT_DONT_OVERWRITE);
-
- ost->st->disposition = ist->st->disposition;
- codec->bits_per_raw_sample= icodec->bits_per_raw_sample;
-@@ -1520,11 +1312,13 @@
- goto fail;
- memcpy(codec->extradata, icodec->extradata, icodec->extradata_size);
- codec->extradata_size= icodec->extradata_size;
-- if(av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/1000){
-- codec->time_base = icodec->time_base;
-- codec->time_base.num *= icodec->ticks_per_frame;
-- } else
-- codec->time_base = ist->st->time_base;
-+ if(!copy_tb && av_q2d(icodec->time_base)*icodec->ticks_per_frame > av_q2d(ist->st->time_base) && av_q2d(ist->st->time_base) < 1.0/500){
-+ codec->time_base = icodec->time_base;
-+ codec->time_base.num *= icodec->ticks_per_frame;
-+ av_reduce(&codec->time_base.num, &codec->time_base.den,
-+ codec->time_base.num, codec->time_base.den, INT_MAX);
-+ } else
-+ codec->time_base = ist->st->time_base;
- switch (codec->codec_type) {
- case AVMEDIA_TYPE_AUDIO:
- if(audio_volume != 256) {
-@@ -1566,12 +1360,25 @@
- return false;
- }
- } else {
-+ if (!ost->enc)
-+ ost->enc = avcodec_find_encoder(ost->st->codec->codec_id);
- switch (codec->codec_type) {
- case AVMEDIA_TYPE_AUDIO:
- ost->fifo= av_fifo_alloc(1024);
- if(!ost->fifo)
- goto fail;
- ost->reformat_pair = MAKE_SFMT_PAIR(AV_SAMPLE_FMT_NONE,AV_SAMPLE_FMT_NONE);
-+ if (!codec->sample_rate) {
-+ codec->sample_rate = icodec->sample_rate;
-+ if (icodec->lowres)
-+ codec->sample_rate >>= icodec->lowres;
-+ }
-+ choose_sample_rate(ost->st, ost->enc);
-+ codec->time_base = (AVRational){1, codec->sample_rate};
-+ if (!codec->channels)
-+ codec->channels = icodec->channels;
-+ if (av_get_channel_layout_nb_channels(codec->channel_layout) != codec->channels)
-+ codec->channel_layout = 0;
- ost->audio_resample = codec->sample_rate != icodec->sample_rate || audio_sync_method > 1;
- icodec->request_channels = codec->channels;
- ist->decoding_needed = 1;
-@@ -1581,6 +1388,9 @@
- ost->resample_channels = icodec->channels;
- break;
- case AVMEDIA_TYPE_VIDEO:
-+ if (codec->pix_fmt == PIX_FMT_NONE)
-+ codec->pix_fmt = icodec->pix_fmt;
-+ choose_pixel_fmt(ost->st, ost->enc);
- if (ost->st->codec->pix_fmt == PIX_FMT_NONE) {
- wxLogError(wxT("Video pixel format is unknown, stream cannot be encoded"));
- return false;
-@@ -1590,13 +1400,30 @@
- if (ost->video_resample) {
- codec->bits_per_raw_sample= frame_bits_per_raw_sample;
- }
-+ if (!codec->width || !codec->height) {
-+ codec->width = icodec->width;
-+ codec->height = icodec->height;
-+ }
- ost->resample_height = icodec->height;
- ost->resample_width = icodec->width;
- ost->resample_pix_fmt= icodec->pix_fmt;
- ost->encoding_needed = 1;
- ist->decoding_needed = 1;
-+
-+ if (!ost->frame_rate.num)
-+ ost->frame_rate = ist->st->r_frame_rate.num ? ist->st->r_frame_rate : (AVRational){25,1};
-+ if (ost->enc && ost->enc->supported_framerates && !force_fps) {
-+ int idx = av_find_nearest_q_idx(ost->frame_rate, ost->enc->supported_framerates);
-+ ost->frame_rate = ost->enc->supported_framerates[idx];
-+ }
-+ codec->time_base = (AVRational){ost->frame_rate.den, ost->frame_rate.num};
-+ if( av_q2d(codec->time_base) < 0.001 && video_sync_method
-+ && (video_sync_method==1 || (video_sync_method<0 && !(os->oformat->flags & AVFMT_VARIABLE_FPS)))){
-+ av_log(os, AV_LOG_WARNING, "Frame rate very high for a muxer not effciciently supporting it.\n"
-+ "Please consider specifiying a lower framerate, a different muxer or -vsync 2\n");
-+ }
-
-- if (configure_filters(ist, ost)) {
-+ if (configure_video_filters(ist, ost)) {
- wxLogError(wxT("Error opening filters!"));
- return false;
- }
-@@ -1653,10 +1480,8 @@
- for (i=0; i<nb_ostreams; i++) {
- ost = ost_table[i];
- if (ost->encoding_needed) {
-- AVCodec *codec = i < nb_output_codecs ? output_codecs[i] : NULL;
-- AVCodecContext *dec = ist_table[ost->source_index]->st->codec;
-- if (!codec)
-- codec = avcodec_find_encoder(ost->st->codec->codec_id);
-+ AVCodec *codec = ost->enc;
-+ AVCodecContext *dec = input_streams[ost->source_index].st->codec;
- if (!codec) {
- error = wxString::Format(wxT("Encoder (codec id %d) not found for output stream #%d.%d"),
- ost->st->codec->codec_id, ost->file_index, ost->index);
-@@ -1683,18 +1508,18 @@
- }
-
- /* open each decoder */
-- for (i=0; i<nb_istreams; i++) {
-- ist = ist_table[i];
-+ for (i = 0; i < nb_input_streams; i++) {
-+ ist = &input_streams[i];
- if (ist->decoding_needed) {
- AVCodec *codec = avcodec_find_decoder(ist->st->codec->codec_id);
- if (!codec) {
- wxLogError(wxT("Decoder (codec id %d) not found for input stream #%d.%d"),
-- ist->st->codec->codec_id, ist->file_index, ist->index);
-+ ist->st->codec->codec_id, ist->file_index, ist->st->index);
- return false;
- }
- if (avcodec_open(ist->st->codec, codec) < 0) {
- wxLogError(wxT("Error while opening decoder for input stream #%d.%d"),
-- ist->file_index, ist->index);
-+ ist->file_index, ist->st->index);
- return false;
- }
- //if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
-@@ -1703,20 +1528,68 @@
- }
-
- /* init pts */
-- for (i=0; i<nb_istreams; i++) {
-+ for (i = 0; i < nb_input_streams; i++) {
- AVStream *st;
-- ist = ist_table[i];
-+ ist = &input_streams[i];
- st= ist->st;
- ist->pts = st->avg_frame_rate.num ? - st->codec->has_b_frames*AV_TIME_BASE / av_q2d(st->avg_frame_rate) : 0;
- ist->next_pts = AV_NOPTS_VALUE;
- ist->is_start = 1;
- }
-+
-+ /* set meta data information from input file if required */
-+ for (i=0;i<nb_meta_data_maps;i++) {
-+ AVFormatContext *files[2];
-+ AVDictionary **meta[2];
-+ int j;
-+
-+#define METADATA_CHECK_INDEX(index, nb_elems, desc)\
-+ if ((index) < 0 || (index) >= (int) (nb_elems)) {\
-+ error = wxString::Format(wxT("Invalid %s index %d while processing metadata maps."), (desc), (index));\
-+ ret = AVERROR(EINVAL);\
-+ goto dump_format;\
-+ }
-+
-+ int out_file_index = meta_data_maps[i][0].file;
-+ int in_file_index = meta_data_maps[i][1].file;
-+ if (in_file_index < 0 || out_file_index < 0)
-+ continue;
-+ METADATA_CHECK_INDEX(out_file_index, nb_output_files, "output file")
-+ METADATA_CHECK_INDEX(in_file_index, nb_input_files, "input file")
-+
-+ files[0] = output_files[out_file_index];
-+ files[1] = input_files[in_file_index].ctx;
-+
-+ for (j = 0; j < 2; j++) {
-+ AVMetaDataMap *map = &meta_data_maps[i][j];
-
-+ switch (map->type) {
-+ case 'g':
-+ meta[j] = &files[j]->metadata;
-+ break;
-+ case 's':
-+ METADATA_CHECK_INDEX(map->index, files[j]->nb_streams, "stream")
-+ meta[j] = &files[j]->streams[map->index]->metadata;
-+ break;
-+ case 'c':
-+ METADATA_CHECK_INDEX(map->index, files[j]->nb_chapters, "chapter")
-+ meta[j] = &files[j]->chapters[map->index]->metadata;
-+ break;
-+ case 'p':
-+ METADATA_CHECK_INDEX(map->index, files[j]->nb_programs, "program")
-+ meta[j] = &files[j]->programs[map->index]->metadata;
-+ break;
-+ }
-+ }
-+
-+ av_dict_copy(meta[0], *meta[1], AV_DICT_DONT_OVERWRITE);
-+ }
-+
- /* copy global metadata by default */
- if (metadata_global_autocopy) {
-
- for (i = 0; i < nb_output_files; i++)
-- av_metadata_copy(&output_files[i]->metadata, input_files[0]->metadata, AV_METADATA_DONT_OVERWRITE);
-+ av_dict_copy(&output_files[i]->metadata, input_files[0].ctx->metadata, AV_DICT_DONT_OVERWRITE);
- }
-
- /* copy chapters according to chapter maps */
-@@ -1742,7 +1615,7 @@
- /* copy chapters from the first input file that has them*/
- if (!nb_chapter_maps)
- for (i = 0; i < nb_input_files; i++) {
-- if (!input_files[i]->nb_chapters)
-+ if (!input_files[i].ctx->nb_chapters)
- continue;
-
- for (j = 0; j < nb_output_files; j++)
-@@ -1776,10 +1649,10 @@
- for(i=0;i<nb_ostreams;i++) {
- ost = ost_table[i];
- wxString msg = wxString::Format(wxT(" Stream #%d.%d -> #%d.%d"),
-- ist_table[ost->source_index]->file_index, ist_table[ost->source_index]->index,
-+ input_streams[ost->source_index].file_index, input_streams[ost->source_index].st->index,
- ost->file_index, ost->index);
-- if (ost->sync_ist != ist_table[ost->source_index])
-- msg += wxString::Format(wxT(" [sync #%d.%d]"), ost->sync_ist->file_index, ost->sync_ist->index);
-+ if (ost->sync_ist != &input_streams[ost->source_index])
-+ msg += wxString::Format(wxT(" [sync #%d.%d]"), ost->sync_ist->file_index, ost->sync_ist->st->index);
- wxLogMessage(msg);
- }
- }
-@@ -1815,12 +1688,12 @@
- double ipts, opts;
- ost = ost_table[i];
- os = output_files[ost->file_index];
-- ist = ist_table[ost->source_index];
-+ ist = &input_streams[ost->source_index];
- if (ist->is_past_recording_time || no_packet[ist->file_index])
- continue;
- opts = ost->st->pts.val * av_q2d(ost->st->time_base);
- ipts = (double)ist->pts;
-- if (!file_table[ist->file_index].eof_reached) {
-+ if (!input_files[ist->file_index].eof_reached) {
- if (ipts < ipts_min) {
- ipts_min = ipts;
- if (input_sync)
-@@ -1853,7 +1726,7 @@
- break;
-
- /* read a frame from it and output it in the fifo */
-- is = input_files[file_index];
-+ is = input_files[file_index].ctx;
- ret= av_read_frame(is, &pkt);
- if(ret == AVERROR(EAGAIN)){
- no_packet[file_index]=1;
-@@ -1861,7 +1734,7 @@
- continue;
- }
- if (ret < 0) {
-- file_table[file_index].eof_reached = 1;
-+ input_files[file_index].eof_reached = 1;
- if (opt_shortest)
- break;
- else
-@@ -1876,11 +1749,11 @@
- // }
-
- /* the following test is needed in case new streams appear
-- dynamically in stream : we ignore them */
-- if (pkt.stream_index >= file_table[file_index].nb_streams)
-+ dynamically in stream : we ignore them */
-+ if (pkt.stream_index >= (int) input_files[file_index].ctx->nb_streams)
- goto discard_packet;
-- ist_index = file_table[file_index].ist_index + pkt.stream_index;
-- ist = ist_table[ist_index];
-+ ist_index = input_files[file_index].ist_index + pkt.stream_index;
-+ ist = &input_streams[ist_index];
- if (ist->discard)
- goto discard_packet;
-
-@@ -1926,7 +1799,7 @@
- //wxLogMessage(wxT("read #%d.%d size=%d"), ist->file_index, ist->index, pkt.size);
- if (!OutputPacket(ist, ist_index, ost_table, nb_ostreams, &pkt, bit_buffer_size, bit_buffer)) {
- if (verbose >= 0)
-- wxLogMessage(wxT("Error while decoding stream #%d.%d"), ist->file_index, ist->index);
-+ wxLogMessage(wxT("Error while decoding stream #%d.%d"), ist->file_index, ist->st->index);
- if (exit_on_error)
- return false;
- av_free_packet(&pkt);
-@@ -1941,8 +1814,8 @@
- }
-
- /* at the end of stream, we must flush the decoder buffers */
-- for (i=0; i<nb_istreams; i++) {
-- ist = ist_table[i];
-+ for (i = 0; i < nb_input_streams; i++) {
-+ ist = &input_streams[i];
- if (ist->decoding_needed)
- OutputPacket(ist, i, ost_table, nb_ostreams, NULL, bit_buffer_size, bit_buffer);
- }
-@@ -1967,8 +1840,8 @@
- }
-
- /* close each decoder */
-- for (i=0; i<nb_istreams; i++) {
-- ist = ist_table[i];
-+ for (i = 0; i < nb_input_streams; i++) {
-+ ist = &input_streams[i];
- if (ist->decoding_needed) {
- avcodec_close(ist->st->codec);
- }
-@@ -1978,15 +1851,7 @@
- ret = 0;
- fail:
- av_freep(&bit_buffer);
-- av_free(file_table);
-
-- if (ist_table) {
-- for (i=0; i<nb_istreams; i++) {
-- ist = ist_table[i];
-- av_free(ist);
-- }
-- av_free(ist_table);
-- }
- if (ost_table) {
- for (i=0; i<nb_ostreams; i++) {
- ost = ost_table[i];
-@@ -2000,7 +1865,7 @@
- av_fifo_free(ost->fifo); /* works even if fifo is not initialized but set to zero */
- av_freep(&ost->st->codec->subtitle_header);
- av_free(ost->resample_frame.data[0]);
--// av_free(ost->forced_kf_pts);
-+ av_free(ost->forced_kf_pts);
- if (ost->video_resample)
- sws_freeContext(ost->img_resample_ctx);
- if (ost->resample)
-@@ -2029,15 +1894,15 @@
- AVFormatContext *os;
- AVOutputStream *ost;
- int ret, i;
-- int got_picture;
-+ int got_output;
- AVFrame picture;
-- void *buffer_to_free;
-+ void *buffer_to_free = NULL;
- unsigned int samples_size = 0;
- AVSubtitle subtitle, *subtitle_to_free;
- int frame_available;
-
- AVPacket avpkt;
-- int bps = av_get_bits_per_sample_fmt(ist->st->codec->sample_fmt)>>3;
-+ int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
-
- if(ist->next_pts == (int64_t) AV_NOPTS_VALUE)
- ist->next_pts= ist->pts;
-@@ -2056,7 +1921,7 @@
- ist->next_pts = ist->pts = av_rescale_q(pkt->dts, ist->st->time_base, AV_TIME_BASE_Q);
-
- //while we have more to decode or while the decoder did output something on EOF
-- while (avpkt.size > 0 || (!pkt && ist->next_pts != ist->pts)) {
-+ while (avpkt.size > 0 || (!pkt && got_output)) {
- uint8_t *data_buf, *decoded_data_buf;
- int data_size, decoded_data_size;
- handle_eof:
-@@ -2090,9 +1955,10 @@
- avpkt.data += ret;
- avpkt.size -= ret;
- data_size = ret;
-+ got_output = decoded_data_size > 0;
- // Some bug in mpeg audio decoder gives
- // decoded_data_size < 0, it seems they are overflows
-- if (decoded_data_size <= 0) {
-+ if (!got_output) {
- // no audio frame
- continue;
- }
-@@ -2106,11 +1972,11 @@
- // XXX: allocate picture correctly
- avcodec_get_frame_defaults(&picture);
-
-- ret = avcodec_decode_video2(ist->st->codec, &picture, &got_picture, &avpkt);
-+ ret = avcodec_decode_video2(ist->st->codec, &picture, &got_output, &avpkt);
- ist->st->quality= picture.quality;
- if (ret < 0)
- goto fail_decode;
-- if (!got_picture) {
-+ if (!got_output) {
- // no picture yet
- goto discard_packet;
- }
-@@ -2121,12 +1987,14 @@
- / ist->st->codec->time_base.den;
- }
- avpkt.size = 0;
-+ buffer_to_free = NULL;
-+ pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
- break;
- case AVMEDIA_TYPE_SUBTITLE:
-- ret = avcodec_decode_subtitle2(ist->st->codec, &subtitle, &got_picture, &avpkt);
-+ ret = avcodec_decode_subtitle2(ist->st->codec, &subtitle, &got_output, &avpkt);
- if (ret < 0)
- goto fail_decode;
-- if (!got_picture) {
-+ if (!got_output) {
- goto discard_packet;
- }
- subtitle_to_free = &subtitle;
-@@ -2157,26 +2025,19 @@
- avpkt.size = 0;
- }
-
-- buffer_to_free = NULL;
-- if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
-- pre_process_video_frame(ist, (AVPicture *)&picture, &buffer_to_free);
-- }
--
-- if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO){
-- for(i=0;i<nb_ostreams;i++) {
-- ost = ost_table[i];
-- if (ost->input_video_filter && ost->source_index == ist_index) {
-- AVRational sar;
-- if (ist->st->sample_aspect_ratio.num) sar = ist->st->sample_aspect_ratio;
-- else sar = ist->st->codec->sample_aspect_ratio;
-- // add it to be filtered
-- av_vsrc_buffer_add_frame2(ost->input_video_filter, &picture,
-- ist->pts,
-- sar, ist->st->codec->width, ist->st->codec->height,
-- ist->st->codec->pix_fmt, "0:0");
-- }
-- }
-- }
-+ if(ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO)
-+ if (start_time == 0 || ist->pts >= start_time) {
-+ for(i=0;i<nb_ostreams;i++) {
-+ ost = ost_table[i];
-+ if (ost->input_video_filter && ost->source_index == ist_index) {
-+ if (!picture.sample_aspect_ratio.num)
-+ picture.sample_aspect_ratio = ist->st->sample_aspect_ratio;
-+ picture.pts = ist->pts;
-+
-+ av_vsrc_buffer_add_frame(ost->input_video_filter, &picture, AV_VSRC_BUF_FLAG_OVERWRITE);
-+ }
-+ }
-+ }
-
- // preprocess audio (volume)
- if (ist->st->codec->codec_type == AVMEDIA_TYPE_AUDIO) {
-@@ -2209,14 +2070,18 @@
-
- ost = ost_table[i];
- if (ost->source_index == ist_index) {
-- frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
-- !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
-- while (frame_available) {
-- AVRational ist_pts_tb;
-- if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter)
-- get_filtered_video_frame(ost->output_video_filter, &picture, &ost->picref, &ist_pts_tb);
-- if (ost->picref)
-- ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
-+ frame_available = ist->st->codec->codec_type != AVMEDIA_TYPE_VIDEO ||
-+ !ost->output_video_filter || avfilter_poll_frame(ost->output_video_filter->inputs[0]);
-+ while (frame_available) {
-+ if (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO && ost->output_video_filter) {
-+ AVRational ist_pts_tb = ost->output_video_filter->inputs[0]->time_base;
-+ if (av_vsink_buffer_get_video_buffer_ref(ost->output_video_filter, &ost->picref, 0) < 0)
-+ goto cont;
-+ if (ost->picref) {
-+ avfilter_fill_frame_from_video_buffer_ref(&picture, ost->picref);
-+ ist->pts = av_rescale_q(ost->picref->pts, ist_pts_tb, AV_TIME_BASE_Q);
-+ }
-+ }
- os = output_files[ost->file_index];
-
- // set the input output pts pairs
-@@ -2232,7 +2097,7 @@
- break;
- case AVMEDIA_TYPE_VIDEO:
- if (ost->picref->video)
-- ost->st->codec->sample_aspect_ratio = ost->picref->video->pixel_aspect;
-+ ost->st->codec->sample_aspect_ratio = ost->picref->video->sample_aspect_ratio;
- if (!DoVideoOut(os, ost, ist, &picture, &frame_size, bit_buffer_size, bit_buffer))
- return false;
- // if (vstats_filename && frame_size)
-@@ -2249,6 +2114,7 @@
- }
- } else {
- AVFrame avframe; //FIXME/XXX remove this
-+ AVPicture pict;
- AVPacket opkt;
- int64_t ost_tb_start_time= av_rescale_q(start_time, AV_TIME_BASE_Q, ost->st->time_base);
-
-@@ -2298,6 +2164,14 @@
- opkt.size = data_size;
- }
-
-+ if (os->oformat->flags & AVFMT_RAWPICTURE) {
-+ /* store AVPicture in AVPacket, as expected by the output format */
-+ avpicture_fill(&pict, opkt.data, ost->st->codec->pix_fmt, ost->st->codec->width, ost->st->codec->height);
-+ opkt.data = (uint8_t *)&pict;
-+ opkt.size = sizeof(AVPicture);
-+ opkt.flags |= AV_PKT_FLAG_KEY;
-+ }
-+
- if (!WriteFrame(os, &opkt, ost->st->codec, ost->bitstream_filters))
- return false;
-
-@@ -2308,8 +2182,7 @@
- cont:
- frame_available = (ist->st->codec->codec_type == AVMEDIA_TYPE_VIDEO) &&
- ost->output_video_filter && avfilter_poll_frame(ost->output_video_filter->inputs[0]);
-- if(ost->picref)
-- avfilter_unref_buffer(ost->picref);
-+ avfilter_unref_buffer(ost->picref);
- }
- }
- }
-@@ -2348,7 +2221,7 @@
- ret = 0;
- // encode any samples remaining in fifo
- if (fifo_bytes > 0) {
-- int osize = av_get_bits_per_sample_fmt(enc->sample_fmt) >> 3;
-+ int osize = av_get_bytes_per_sample(enc->sample_fmt);
- int fs_tmp = enc->frame_size;
- av_fifo_generic_read(ost->fifo, audio_buf, fifo_bytes, NULL);
- if (enc->codec->capabilities & CODEC_CAP_SMALL_LAST_FRAME) {
-@@ -2447,11 +2320,11 @@
- int64_t audio_out_size, audio_buf_size;
- int64_t allocated_for_size= size;
-
-- int size_out, frame_bytes, ret;
-+ int size_out, frame_bytes, ret, resample_changed;
- AVCodecContext *enc= ost->st->codec;
- AVCodecContext *dec= ist->st->codec;
-- int osize= av_get_bits_per_sample_fmt(enc->sample_fmt)/8;
-- int isize= av_get_bits_per_sample_fmt(dec->sample_fmt)/8;
-+ int osize= av_get_bytes_per_sample(enc->sample_fmt);
-+ int isize= av_get_bytes_per_sample(dec->sample_fmt);
- const int coded_bps = av_get_bits_per_sample(enc->codec->id);
-
- need_realloc:
-@@ -2481,18 +2354,42 @@
- if (enc->channels != dec->channels)
- ost->audio_resample = 1;
-
-- if (ost->audio_resample && !ost->resample) {
-- if (dec->sample_fmt != SAMPLE_FMT_S16)
-- wxLogWarning(wxT("Warning, using s16 intermediate sample format for resampling"));
-- ost->resample = av_audio_resample_init(enc->channels, dec->channels,
-- enc->sample_rate, dec->sample_rate,
-- enc->sample_fmt, dec->sample_fmt,
-- 16, 10, 0, 0.8);
-- if (!ost->resample) {
-- wxLogError(wxT("Can not resample %d channels @ %d Hz to %d channels @ %d Hz"),
-- dec->channels, dec->sample_rate,
-- enc->channels, enc->sample_rate);
-- return false;
-+ resample_changed = ost->resample_sample_fmt != dec->sample_fmt ||
-+ ost->resample_channels != dec->channels ||
-+ ost->resample_sample_rate != dec->sample_rate;
-+
-+ if ((ost->audio_resample && !ost->resample) || resample_changed) {
-+ if (resample_changed) {
-+ av_log(NULL, AV_LOG_INFO, "Input stream #%d.%d frame changed from rate:%d fmt:%s ch:%d to rate:%d fmt:%s ch:%d\n",
-+ ist->file_index, ist->st->index,
-+ ost->resample_sample_rate, av_get_sample_fmt_name(ost->resample_sample_fmt), ost->resample_channels,
-+ dec->sample_rate, av_get_sample_fmt_name(dec->sample_fmt), dec->channels);
-+ ost->resample_sample_fmt = dec->sample_fmt;
-+ ost->resample_channels = dec->channels;
-+ ost->resample_sample_rate = dec->sample_rate;
-+ if (ost->resample)
-+ audio_resample_close(ost->resample);
-+ }
-+ /* if audio_sync_method is >1 the resampler is needed for audio drift compensation */
-+ if (audio_sync_method <= 1 &&
-+ ost->resample_sample_fmt == enc->sample_fmt &&
-+ ost->resample_channels == enc->channels &&
-+ ost->resample_sample_rate == enc->sample_rate) {
-+ ost->resample = NULL;
-+ ost->audio_resample = 0;
-+ } else {
-+ if (dec->sample_fmt != SAMPLE_FMT_S16)
-+ wxLogWarning(wxT("Warning, using s16 intermediate sample format for resampling"));
-+ ost->resample = av_audio_resample_init(enc->channels, dec->channels,
-+ enc->sample_rate, dec->sample_rate,
-+ enc->sample_fmt, dec->sample_fmt,
-+ 16, 10, 0, 0.8);
-+ if (!ost->resample) {
-+ wxLogError(wxT("Can not resample %d channels @ %d Hz to %d channels @ %d Hz"),
-+ dec->channels, dec->sample_rate,
-+ enc->channels, enc->sample_rate);
-+ return false;
-+ }
- }
- }
-
-@@ -2619,7 +2516,7 @@
- pkt.size= ret;
- if(enc->coded_frame && enc->coded_frame->pts != (int64_t) AV_NOPTS_VALUE)
- pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
-- pkt.flags |= PKT_FLAG_KEY;
-+ pkt.flags |= AV_PKT_FLAG_KEY;
- if (!WriteFrame(s, &pkt, ost->st->codec, ost->bitstream_filters))
- return false;
-
-@@ -2704,7 +2601,7 @@
- bool wxFfmpegMediaTranscoder::DoVideoOut(AVFormatContext *s, AVOutputStream *ost,
- AVInputStream *ist, AVFrame *in_picture, int *frame_size,
- int bit_buffer_size, uint8_t* bit_buffer) {
-- int nb_frames, i, ret, av_unused resample_changed;
-+ int nb_frames, i, ret;
- AVFrame *final_picture, *formatted_picture;
- AVCodecContext *enc, *dec;
- double sync_ipts;
-@@ -2787,15 +2684,13 @@
- // handles sameq here. This is not correct because it may not be a global option
- big_picture.quality = same_quality ? (int) ist->st->quality : (int) ost->st->quality;
- if (!me_threshold)
-- big_picture.pict_type = 0;
--// big_picture.pts = AV_NOPTS_VALUE;
-+ big_picture.pict_type = (AVPictureType) 0;
- big_picture.pts= ost->sync_opts;
--// big_picture.pts= av_rescale(ost->sync_opts, AV_TIME_BASE*(int64_t)enc->time_base.num, enc->time_base.den);
--// if (ost->forced_kf_index < ost->forced_kf_count &&
--// big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
--// big_picture.pict_type = AV_PICTURE_TYPE_I;
--// ost->forced_kf_index++;
--// }
-+ if (ost->forced_kf_index < ost->forced_kf_count &&
-+ big_picture.pts >= ost->forced_kf_pts[ost->forced_kf_index]) {
-+ big_picture.pict_type = AV_PICTURE_TYPE_I;
-+ ost->forced_kf_index++;
-+ }
- ret = avcodec_encode_video(enc, bit_buffer, bit_buffer_size, &big_picture);
- if (ret < 0) {
- wxLogError(wxT("Video encoding failed"));
-@@ -2806,17 +2701,12 @@
- pkt.size= ret;
- if(enc->coded_frame->pts != (int64_t) AV_NOPTS_VALUE)
- pkt.pts= av_rescale_q(enc->coded_frame->pts, enc->time_base, ost->st->time_base);
-- //av_log(NULL, AV_LOG_DEBUG, "encoder -> %"PRId64"/%"PRId64"\n",
-- //pkt.pts != AV_NOPTS_VALUE ? av_rescale(pkt.pts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1,
-- //pkt.dts != AV_NOPTS_VALUE ? av_rescale(pkt.dts, enc->time_base.den, AV_TIME_BASE*(int64_t)enc->time_base.num) : -1);
--
-+
- if(enc->coded_frame->key_frame)
- pkt.flags |= AV_PKT_FLAG_KEY;
- WriteFrame(s, &pkt, ost->st->codec, ost->bitstream_filters);
- *frame_size = ret;
- video_size += ret;
-- //wxLogError(wxT("Frame: %3d size: %5d type: %d"),
-- // enc->frame_number-1, ret, enc->pict_type);
- // if two pass, output log
- if (ost->logfile && enc->stats_out) {
- fprintf(ost->logfile, "%s", enc->stats_out);
-@@ -2896,7 +2786,8 @@
- int64_t total_size;
- AVCodecContext *enc;
- int frame_number, vid, i;
-- double bitrate, ti1, pts;
-+ double bitrate;
-+ int64_t pts = INT64_MAX;
- static int64_t last_time = -1;
- static int qp_histogram[52];
-
-@@ -2920,11 +2811,13 @@
- total_size= avio_tell(oc->pb);
-
- wxString msg;
-- ti1 = 1e10;
- vid = 0;
- for (i=0; i<nb_ostreams; i++) {
-+ float q = -1;
- ost = ost_table[i];
- enc = ost->st->codec;
-+ if (!ost->st->stream_copy && enc->coded_frame)
-+ q = enc->coded_frame->quality/(float)FF_QP2LAMBDA;
- if (vid && enc->codec_type == AVMEDIA_TYPE_VIDEO) {
- msg += wxString::Format(wxT("q=%2.1f "),
- !ost->st->stream_copy ? enc->coded_frame->quality/(float)FF_QP2LAMBDA : -1);
-@@ -2940,7 +2833,7 @@
- msg += wxString::Format(wxT("L"));
- if (qp_hist) {
- int j;
-- int qp = (int) rint(enc->coded_frame->quality/(float)FF_QP2LAMBDA);
-+ int qp = lrintf(q);
- if (qp>=0 && qp < (int) (FF_ARRAY_ELEMS(qp_histogram)))
- qp_histogram[qp]++;
- for (j=0; j<32; j++)
-@@ -2971,18 +2864,22 @@
- vid = 1;
- }
- // compute min output value
-- pts = (double)ost->st->pts.val * av_q2d(ost->st->time_base);
-- if ((pts < ti1) && (pts > 0))
-- ti1 = pts;
-+ pts = FFMIN(pts, av_rescale_q(ost->st->pts.val, ost->st->time_base, AV_TIME_BASE_Q));
- }
-- if (ti1 < 0.01)
-- ti1 = 0.01;
-
- if (verbose || is_last_report) {
-- bitrate = (double)(total_size * 8) / ti1 / 1000.0;
-+ int hours, mins, secs, us;
-+ secs = pts / AV_TIME_BASE;
-+ us = pts % AV_TIME_BASE;
-+ mins = secs / 60;
-+ secs %= 60;
-+ hours = mins / 60;
-+ mins %= 60;
-+
-+ bitrate = pts ? total_size * 8 / (pts / 1000.0) : 0;
-
-- msg += wxString::Format(wxT("size=%8.0fkB time=%0.2f bitrate=%6.1fkbits/s"),
-- (double)total_size / 1024, ti1, bitrate);
-+ msg += wxString::Format(wxT("size=%8.0fkB time=%02d:%02d:%02d.%02d bitrate=%6.1fkbits/s"),
-+ (double) total_size / 1024, hours, mins, secs, (100 * us) / AV_TIME_BASE, bitrate);
-
- if (nb_frames_dup || nb_frames_drop)
- msg += wxString::Format(wxT(" dup=%d drop=%d"), nb_frames_dup, nb_frames_drop);
-@@ -3013,10 +2910,9 @@
- }
- nb_output_files = 0;
- for (int i=0; i<nb_input_files; i++) {
-- av_close_input_file(input_files[i]);
-+ av_close_input_file(input_files[i].ctx);
- av_free(input_files_ts_scale[i]);
- }
-- nb_input_files = 0;
-
- av_freep(&intra_matrix);
- av_freep(&inter_matrix);
-@@ -3025,11 +2921,14 @@
- fclose(vstats_file);
- av_freep(&vstats_filename);
-
-- av_freep(&output_codecs);
-- nb_output_codecs = 0;
- av_freep(&stream_maps);
- nb_stream_maps = 0;
-
-+ av_freep(&input_streams);
-+ nb_input_streams = 0;
-+ av_freep(&input_files);
-+ nb_input_files = 0;
-+
- av_freep(&video_standard);
- av_freep(&audio_buf);
- av_freep(&audio_out);
-diff -Naur DVDStyler-1.8.4.3.orig/src/mediatrc_ffmpeg.h DVDStyler-1.8.4.3/src/mediatrc_ffmpeg.h
---- DVDStyler-1.8.4.3.orig/src/mediatrc_ffmpeg.h 2011-05-15 09:23:34.000000000 -0400
-+++ DVDStyler-1.8.4.3/src/mediatrc_ffmpeg.h 2011-09-18 18:13:29.000000000 -0400
-@@ -3,7 +3,7 @@
- // Purpose: FFMPEG Media Transcoder
- // Author: Alex Thuering
- // Created: 26.04.2008
--// RCS-ID: $Id: mediatrc_ffmpeg.h,v 1.19 2011/05/15 13:23:34 ntalex Exp $
-+// RCS-ID: $Id: mediatrc_ffmpeg.h,v 1.20 2011/07/24 07:58:21 ntalex Exp $
- // Copyright: (c) Alex Thuering
- // Licence: GPL
- /////////////////////////////////////////////////////////////////////////////
-@@ -20,13 +20,8 @@
- extern "C" {
- #define __STDC_CONSTANT_MACROS
- #define __STDC_LIMIT_MACROS
--#ifdef HAVE_FFMPEG_AVUTIL_H
--#include <avformat.h>
--#include <swscale.h>
--#else
- #include <libavformat/avformat.h>
- #include <libswscale/swscale.h>
--#endif
- }
-
- // select an input stream for an output stream
-@@ -39,8 +34,9 @@
-
- // select an input file for an output file
- typedef struct AVMetaDataMap {
-- int out_file;
-- int in_file;
-+ int file; //< file index
-+ char type; //< type of metadata to copy -- (g)lobal, (s)tream, (c)hapter or (p)rogram
-+ int index; //< stream/chapter/program number
- } AVMetaDataMap;
-
- typedef struct AVChapterMap {
-@@ -50,6 +46,8 @@
-
- struct AVInputStream;
- struct AVOutputStream;
-+struct AVDictionary;
-+struct AVInputFile;
-
- #define MAX_FILES 50
- #define MAX_STREAMS_ 20
-@@ -108,21 +106,20 @@
- void PrintReport(AVFormatContext **output_files, AVOutputStream **ost_table,
- int nb_ostreams, int is_last_report);
- int CopyChapters(int infile, int outfile);
-- AVFormatContext *input_files[MAX_FILES];
-- int nb_input_files;
- int64_t input_files_ts_offset[MAX_FILES];
- double* input_files_ts_scale[MAX_FILES];
- int nb_input_files_ts_scale[MAX_FILES];
-+
-+ AVCodec **input_codecs;
-+ int nb_input_codecs;
-
- AVFormatContext* output_files[MAX_FILES];
-- AVCodec** output_codecs;
- int nb_output_files;
-- int nb_output_codecs;
-
- AVStreamMap* stream_maps;
- int nb_stream_maps;
-
-- AVMetaDataMap meta_data_maps[MAX_FILES];
-+ AVMetaDataMap (*meta_data_maps)[2];
- int nb_meta_data_maps;
- int metadata_global_autocopy;
- int metadata_streams_autocopy;
-@@ -134,7 +131,6 @@
- int frame_width;
- int frame_height;
- float frame_aspect_ratio;
-- int frame_aspect_ratio_override;
- PixelFormat frame_pix_fmt;
- int frame_bits_per_raw_sample;
- SampleFormat audio_sample_fmt;
-@@ -163,10 +159,10 @@
- int audio_channels;
- unsigned int audio_codec_tag;
- char *audio_language;
--
-+
- char *subtitle_language;
- unsigned int subtitle_codec_tag;
--
-+
- float mux_preload;
- float mux_max_delay;
-
-@@ -174,7 +170,7 @@
- int64_t start_time;
- int64_t recording_timestamp;
- int64_t input_ts_offset;
-- AVMetadata* metadata;
-+ AVDictionary *metadata;
- int do_psnr;
- int do_pass;
- const char *pass_logfilename_prefix;
-@@ -182,8 +178,8 @@
- int audio_sync_method;
- float audio_drift_threshold;
- int copy_ts;
-- int opt_shortest; //
-- int video_global_header;
-+ int copy_tb;
-+ int opt_shortest;
- char *vstats_filename;
- FILE *vstats_file;
- int opt_programid;
-@@ -222,6 +218,12 @@
- AVBitStreamFilterContext *video_bitstream_filters;
- AVBitStreamFilterContext *audio_bitstream_filters;
- AVBitStreamFilterContext *subtitle_bitstream_filters;
-+
-+ AVInputStream *input_streams;
-+ int nb_input_streams;
-+ AVInputFile *input_files;
-+ int nb_input_files;
-+
- AVOutputStream** output_streams_for_file[MAX_FILES];
- int nb_output_streams_for_file[MAX_FILES];
- };