ffmpeg2theora.c 110 KB
Newer Older
1
/* -*- tab-width:4;c-file-style:"cc-mode"; -*- */
2
/*
3
4
 * ffmpeg2theora.c -- Convert ffmpeg supported a/v files to  Ogg Theora / Vorbis
 * Copyright (C) 2003-2009 <j@v2v.cc>
5
 *
6
 * This program is free software: you can redistribute it and/or modify
7
 * it under the terms of the GNU General Public License as published by
8
 * the Free Software Foundation, either version 3 of the License, or
9
10
11
12
13
14
15
16
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
17
 * along with This program.  If not, see <http://www.gnu.org/licenses/>.
18
19
20
21
22
23
24
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <getopt.h>
25
#include <math.h>
26
#include <errno.h>
27

28
29
#include "libavformat/avformat.h"
#include "libavdevice/avdevice.h"
30
#ifdef HAVE_FRAMEHOOK
Jan Gerber's avatar
Jan Gerber committed
31
#include "libavformat/framehook.h"
32
#endif
33
34
#include "libswscale/swscale.h"
#include "libpostproc/postprocess.h"
35

Jan Gerber's avatar
Jan Gerber committed
36
#include "theora/theoraenc.h"
37
38
39
#include "vorbis/codec.h"
#include "vorbis/vorbisenc.h"

40
41
42
43
#ifdef WIN32
#include "fcntl.h"
#endif

44
#include "theorautils.h"
45
#include "iso639.h"
46
47
#include "subtitles.h"
#include "ffmpeg2theora.h"
48
#include "avinfo.h"
49

50
51
#define LENGTH(x) (sizeof(x) / sizeof(*x))

52
enum {
Jan Gerber's avatar
Jan Gerber committed
53
54
    NULL_FLAG,
    DEINTERLACE_FLAG,
Jan Gerber's avatar
Jan Gerber committed
55
    SOFTTARGET_FLAG,
Jan Gerber's avatar
Jan Gerber committed
56
57
58
    TWOPASS_FLAG,
    FIRSTPASS_FLAG,
    SECONDPASS_FLAG,
Jan Gerber's avatar
Jan Gerber committed
59
    OPTIMIZE_FLAG,
60
    NOSYNC_FLAG,
Jan Gerber's avatar
Jan Gerber committed
61
62
    NOAUDIO_FLAG,
    NOVIDEO_FLAG,
63
    NOSUBTITLES_FLAG,
64
    NOMETADATA_FLAG,
65
    NOOSHASH_FLAG,
Jan Gerber's avatar
Jan Gerber committed
66
67
68
69
70
71
    NOUPSCALING_FLAG,
    CROPTOP_FLAG,
    CROPBOTTOM_FLAG,
    CROPRIGHT_FLAG,
    CROPLEFT_FLAG,
    ASPECT_FLAG,
72
    PIXEL_ASPECT_FLAG,
Jan Gerber's avatar
Jan Gerber committed
73
74
75
    MAXSIZE_FLAG,
    INPUTFPS_FLAG,
    AUDIOSTREAM_FLAG,
Jan Gerber's avatar
Jan Gerber committed
76
    VIDEOSTREAM_FLAG,
Jan Gerber's avatar
Jan Gerber committed
77
78
79
80
81
82
83
84
85
86
    SUBTITLES_FLAG,
    SUBTITLES_ENCODING_FLAG,
    SUBTITLES_LANGUAGE_FLAG,
    SUBTITLES_CATEGORY_FLAG,
    SUBTITLES_IGNORE_NON_UTF8_FLAG,
    VHOOK_FLAG,
    FRONTEND_FLAG,
    FRONTENDFILE_FLAG,
    SPEEDLEVEL_FLAG,
    PP_FLAG,
87
    NOSKELETON,
88
89
    SEEK_INDEX,
    INDEX_INTERVAL,
Jan Gerber's avatar
Jan Gerber committed
90
91
    THEORA_INDEX_RESERVE,
    VORBIS_INDEX_RESERVE,
92
    INFO_FLAG
93
} F2T_FLAGS;
Jan Gerber's avatar
Jan Gerber committed
94

Jan Gerber's avatar
Jan Gerber committed
95
enum {
Jan Gerber's avatar
Jan Gerber committed
96
97
98
99
100
101
    V2V_PRESET_NONE,
    V2V_PRESET_PRO,
    V2V_PRESET_PREVIEW,
    V2V_PRESET_VIDEOBIN,
    V2V_PRESET_PADMA,
    V2V_PRESET_PADMASTREAM,
Jan Gerber's avatar
Jan Gerber committed
102
} F2T_PRESETS;
Jan Gerber's avatar
Jan Gerber committed
103

104

105
106
107
108
109
110
111
112
113
#define PAL_HALF_WIDTH 384
#define PAL_HALF_HEIGHT 288
#define NTSC_HALF_WIDTH 320
#define NTSC_HALF_HEIGHT 240

#define PAL_FULL_WIDTH 720
#define PAL_FULL_HEIGHT 576
#define NTSC_FULL_WIDTH 720
#define NTSC_FULL_HEIGHT 480
Jan Gerber's avatar
Jan Gerber committed
114

Jan Gerber's avatar
Jan Gerber committed
115

Jan Gerber's avatar
Jan Gerber committed
116
oggmux_info info;
117

118
119
static int using_stdin = 0;

Jan Gerber's avatar
Jan Gerber committed
120
121
static int padcolor[3] = { 16, 128, 128 };

122

Jan Gerber's avatar
Jan Gerber committed
123
124
125
126
127
128
static int ilog(unsigned _v){
  int ret;
  for(ret=0;_v;ret++)_v>>=1;
  return ret;
}

129
/**
Jan Gerber's avatar
Jan Gerber committed
130
 * Allocate and initialise an AVFrame.
131
 */
Jan Gerber's avatar
Jan Gerber committed
132
static AVFrame *frame_alloc(int pix_fmt, int width, int height) {
Jan Gerber's avatar
Jan Gerber committed
133
134
135
136
    AVFrame *picture;
    uint8_t *picture_buf;
    int size;

Jan Gerber's avatar
Jan Gerber committed
137
    picture = avcodec_alloc_frame();
Jan Gerber's avatar
Jan Gerber committed
138
139
140
141
    if (!picture)
        return NULL;
    size = avpicture_get_size (pix_fmt, width, height);
    picture_buf = av_malloc (size);
Jan Gerber's avatar
Jan Gerber committed
142
    if (!picture_buf) {
Jan Gerber's avatar
Jan Gerber committed
143
144
145
        av_free (picture);
        return NULL;
    }
Jan Gerber's avatar
Jan Gerber committed
146
    avpicture_fill((AVPicture *) picture, picture_buf, pix_fmt, width, height);
Jan Gerber's avatar
Jan Gerber committed
147
    return picture;
148
149
}

150
151
152
/**
 * Frees an AVFrame.
 */
Jan Gerber's avatar
Jan Gerber committed
153
static void frame_dealloc(AVFrame *frame) {
154
    if (frame) {
Jan Gerber's avatar
Jan Gerber committed
155
        avpicture_free((AVPicture*)frame);
156
157
158
159
        av_free(frame);
    }
}

160
161
162
163
/**
 * initialize ff2theora with default values
 * @return ff2theora struct
 */
Jan Gerber's avatar
Jan Gerber committed
164
static ff2theora ff2theora_init() {
Jan Gerber's avatar
Jan Gerber committed
165
    ff2theora this = calloc (1, sizeof (*this));
Jan Gerber's avatar
Jan Gerber committed
166
    if (this != NULL) {
Jan Gerber's avatar
Jan Gerber committed
167
        this->disable_audio=0;
168
        this->disable_video=0;
169
        this->disable_subtitles=0;
170
        this->disable_metadata=0;
171
        this->disable_oshash=0;
172
        this->no_upscaling=0;
Jan Gerber's avatar
Jan Gerber committed
173
174
175
176
177
178
        this->video_index = -1;
        this->audio_index = -1;
        this->start_time=0;
        this->end_time=0; /* 0 denotes no end time set */

        // audio
179
180
        this->sample_rate = -1;  // samplerate hmhmhm
        this->channels = -1;
181
        this->audio_quality = 1.00;// audio quality 1
Jan Gerber's avatar
Jan Gerber committed
182
        this->audio_bitrate=0;
183
        this->audiostream = -1;
Jan Gerber's avatar
Jan Gerber committed
184

Jan Gerber's avatar
Jan Gerber committed
185
        // video
Jan Gerber's avatar
Jan Gerber committed
186
        this->videostream = -1;
Jan Gerber's avatar
Jan Gerber committed
187
188
        this->picture_width=0;      // set to 0 to not resize the output
        this->picture_height=0;      // set to 0 to not resize the output
Jan Gerber's avatar
Jan Gerber committed
189
        this->video_quality=-1; // defaults set later
Jan Gerber's avatar
Jan Gerber committed
190
        this->video_bitrate=0;
Jan Gerber's avatar
Jan Gerber committed
191
        this->keyint=0;
192
193
        this->force_input_fps.num = -1;
        this->force_input_fps.den = 1;
194
        this->sync = 1;
Jan Gerber's avatar
Jan Gerber committed
195
196
        this->aspect_numerator=0;
        this->aspect_denominator=0;
197
198
199
200
201
        this->colorspace = TH_CS_UNSPECIFIED;
        this->frame_aspect.num=0;
        this->frame_aspect.den=1;
        this->pixel_aspect.num=0;
        this->pixel_aspect.den=0;
202
203
        this->max_x=-1;
        this->max_y=-1;
Jan Gerber's avatar
Jan Gerber committed
204
        this->deinterlace=0; // auto by default, if input is flaged as interlaced it will deinterlace.
Jan Gerber's avatar
Jan Gerber committed
205
206
        this->soft_target=0;
        this->buf_delay=-1;
Jan Gerber's avatar
Jan Gerber committed
207
        this->vhook=0;
208
209
        this->framerate_new.num = -1;
        this->framerate_new.den = 1;
Jan Gerber's avatar
Jan Gerber committed
210

Jan Gerber's avatar
Jan Gerber committed
211
212
213
214
        this->frame_topBand=0;
        this->frame_bottomBand=0;
        this->frame_leftBand=0;
        this->frame_rightBand=0;
Jan Gerber's avatar
Jan Gerber committed
215

216
217
        this->n_kate_streams=0;
        this->kate_streams=NULL;
218
        this->ignore_non_utf8 = 0;
219

220
        this->pix_fmt = PIX_FMT_YUV420P;
221
222
223
224
225
226
227
228
229

        // ffmpeg2theora --nosound -f dv -H 32000 -S 0 -v 8 -x 384 -y 288 -G 1.5 input.dv
        this->video_gamma  = 0.0;
        this->video_bright = 0.0;
        this->video_contr  = 0.0;
        this->video_satur  = 1.0;

        this->y_lut_used = 0;
        this->uv_lut_used = 0;
230
231
        this->sws_colorspace_ctx = NULL;
        this->sws_scale_ctx = NULL;
Jan Gerber's avatar
Jan Gerber committed
232
233
    }
    return this;
234
235
}

236
237
238
239
240
241
242
243
244
// gamma lookup table code

static void y_lut_init(ff2theora this) {
    int i;
    double v;

    double c = this->video_contr;
    double b = this->video_bright;
    double g = this->video_gamma;
Jan Gerber's avatar
Jan Gerber committed
245

246
247
248
249
250
251
252
    if ((g < 0.01) || (g > 100.0)) g = 1.0;
    if ((c < 0.01) || (c > 100.0)) c = 1.0;
    if ((b < -1.0) || (b > 1.0))   b = 0.0;

    if (g == 1.0 && c == 1.0 && b == 0.0) return;
    this->y_lut_used = 1;

Jan Gerber's avatar
typo    
Jan Gerber committed
253
    fprintf(stderr, "  Video correction: gamma=%g, contrast=%g, brightness=%g\n", g, c, b);
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280

    g = 1.0 / g;    // larger values shall make brighter video.

    for (i = 0; i < 256; i++) {
        v = (double) i / 255.0;
        v = c * v + b * 0.1;
        if (v < 0.0) v = 0.0;
        v = pow(v, g) * 255.0;    // mplayer's vf_eq2.c multiplies with 256 here, strange...

        if (v >= 255)
            this->y_lut[i] = 255;
        else
            this->y_lut[i] = (unsigned char)(v+0.5);
    }
}


static void uv_lut_init(ff2theora this) {
    int i;
    double v, s;
    s = this->video_satur;

    if ((s < 0.0) || (s > 100.0)) s = 1.0;

    if (s == 1.0) return;
    this->uv_lut_used = 1;

Jan Gerber's avatar
typo    
Jan Gerber committed
281
    fprintf(stderr, "  Color correction: saturation=%g\n", s);
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310

    for (i = 0; i < 256; i++) {
        v = 127.0 + (s * ((double)i - 127.0));
        if (v < 0.0) v = 0.0;

        if (v >= 255.0)
            this->uv_lut[i] = 255;
        else
            this->uv_lut[i] = (unsigned char)(v+0.5);
    }
}

static void lut_init(ff2theora this) {
    y_lut_init(this);
    uv_lut_init(this);
}

static void lut_apply(unsigned char *lut, unsigned char *src, unsigned char *dst, int width, int height, int stride) {
    int x, y;

    for (y = 0; y < height; y++) {
        for (x = 0; x < width; x++) {
            dst[x] = lut[src[x]];
        }
        src += stride;
        dst += stride;
    }
}

Jan Gerber's avatar
Jan Gerber committed
311
static void prepare_ycbcr_buffer(ff2theora this, th_ycbcr_buffer ycbcr, AVFrame *frame) {
Jan Gerber's avatar
Jan Gerber committed
312
    /* pysical pages */
Jan Gerber's avatar
Jan Gerber committed
313
314
315
316
    ycbcr[0].width = this->frame_width;
    ycbcr[0].height = this->frame_height;
    ycbcr[0].stride = frame->linesize[0];
    ycbcr[0].data = frame->data[0];
Jan Gerber's avatar
Jan Gerber committed
317

Jan Gerber's avatar
Jan Gerber committed
318
319
320
321
    ycbcr[1].width = this->frame_width / 2;
    ycbcr[1].height = this->frame_height / 2;
    ycbcr[1].stride = frame->linesize[1];
    ycbcr[1].data = frame->data[1];
Jan Gerber's avatar
Jan Gerber committed
322

Jan Gerber's avatar
Jan Gerber committed
323
324
325
326
    ycbcr[2].width = this->frame_width / 2;
    ycbcr[2].height = this->frame_height / 2;
    ycbcr[2].stride = frame->linesize[1];
    ycbcr[2].data = frame->data[2];
327

328
    if (this->y_lut_used) {
Jan Gerber's avatar
Jan Gerber committed
329
        lut_apply(this->y_lut, ycbcr[0].data, ycbcr[0].data, ycbcr[0].width, ycbcr[0].height, ycbcr[0].stride);
Jan Gerber's avatar
Jan Gerber committed
330
    }
331
    if (this->uv_lut_used) {
Jan Gerber's avatar
Jan Gerber committed
332
333
        lut_apply(this->uv_lut, ycbcr[1].data, ycbcr[1].data, ycbcr[1].width, ycbcr[1].height, ycbcr[1].stride);
        lut_apply(this->uv_lut, ycbcr[2].data, ycbcr[2].data, ycbcr[2].width, ycbcr[2].height, ycbcr[2].stride);
Jan Gerber's avatar
Jan Gerber committed
334
335
336
    }
}

337
338
339
340
341
342
343
static int is_supported_subtitle_stream(ff2theora this, int idx)
{
  AVCodecContext *enc = this->context->streams[idx]->codec;
  if (enc->codec_type != CODEC_TYPE_SUBTITLE) return 0;
  switch (enc->codec_id) {
    case CODEC_ID_TEXT:
    case CODEC_ID_SSA:
344
    case CODEC_ID_MOV_TEXT:
345
346
347
348
349
350
351
      return 1;
    default:
      return 0;
  }
  return 0;
}

352
static char *get_raw_text_from_ssa(const char *ssa)
353
{
354
  int n,intag,inescape;
355
  char *multiblock = NULL, *realloced_mb;
356
357
358
359
  char *allocated;
  const char *dialogue, *ptr, *tag_start;

  if (!ssa) return NULL;
360
361
362
363
364
365
366
367
368
369
370

  /* turns out some SSA packets have several blocks, each on a single line, so loop */
  while (ssa) {
    dialogue=strstr(ssa, "Dialogue:");
    if (!dialogue) break;

    ptr = dialogue;
    for (n=0;n<9;++n) {
      ptr=strchr(ptr,',');
      if (!ptr) return NULL;
      ++ptr;
371
    }
372
373
374
375
376
377
378
379
380
381
    dialogue = ptr;
    allocated = strdup(dialogue);

    /* find all "{...}" tags - the following must work for UTF-8 */
    intag=inescape=0;
    n=0;
    for (ptr=dialogue; *ptr && *ptr!='\n'; ++ptr) {
      if (*ptr=='{') {
        if (intag==0) tag_start = ptr;
        ++intag;
382
      }
383
384
385
386
387
      else if (*ptr=='}') {
        --intag;
        if (intag == 0) {
          /* tag parsing - none for now */
        }
388
      }
389
390
391
392
393
394
395
      else if (!intag) {
        if (inescape) {
          if (*ptr == 'N' || *ptr == 'n')
            allocated[n++] = '\n';
          else if (*ptr == 'h')
            allocated[n++] = ' ';
          inescape=0;
396
397
        }
        else {
398
399
400
401
402
403
          if (*ptr=='\\') {
            inescape=1;
          }
          else {
            allocated[n++]=*ptr;
          }
404
405
406
        }
      }
    }
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
    allocated[n]=0;

    /* skip over what we read */
    ssa = ptr;

    /* remove any trailing newlines (also \r characters) */
    n = strlen(allocated);
    while (n>0 && (allocated[n-1]=='\n' || allocated[n-1]=='\r'))
      allocated[--n]=0;

    /* add this new block */
    realloced_mb = (char*)realloc(multiblock, (multiblock?strlen(multiblock):0) + strlen(allocated) + 2); /* \n + 0 */
    if (realloced_mb) {
      if (multiblock) strcat(realloced_mb, "\n"); else strcpy(realloced_mb, "");
      strcat(realloced_mb, allocated);
      multiblock = realloced_mb;
      free(allocated);
    }
425
426
  }

427
  return multiblock;
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
}

static const float get_ssa_time(const char *p)
{
    int hour, min, sec, hsec;

    if(sscanf(p, "%d:%d:%d%*c%d", &hour, &min, &sec, &hsec) != 4)
        return 0;

    min+= 60*hour;
    sec+= 60*min;
    return (float)(sec*100+hsec)/100;
}

static const float get_duration_from_ssa(const char *ssa)
{
  float d = 2.0f;
  double start, end;
  const char *ptr=ssa;

  ptr=strchr(ptr,',');
  if (!ptr) return d;
  ptr++;
  start = get_ssa_time(ptr);
  ptr=strchr(ptr,',');
  if (!ptr) return d;
  ptr++;
  end = get_ssa_time(ptr);

  return end-start;
}

static const char *find_language_for_subtitle_stream(const AVStream *s)
{
  const char *lang=find_iso639_1(s->language);
  if (!lang) {
    fprintf(stderr,"WARNING - unrecognized ISO 639-2 language code: %s\n",s->language);
  }
  return lang;
}

469
void ff2theora_output(ff2theora this) {
470
    unsigned int i;
Jan Gerber's avatar
Jan Gerber committed
471
472
    AVCodecContext *aenc = NULL;
    AVCodecContext *venc = NULL;
473
    int venc_pix_fmt;
Jan Gerber's avatar
Jan Gerber committed
474
475
476
477
    AVStream *astream = NULL;
    AVStream *vstream = NULL;
    AVCodec *acodec = NULL;
    AVCodec *vcodec = NULL;
478
479
    pp_mode_t *ppMode = NULL;
    pp_context_t *ppContext = NULL;
480
    int sws_flags;
Jan Gerber's avatar
Jan Gerber committed
481
    float frame_aspect = 0;
482
    double fps = 0.0;
483
    AVRational vstream_fps;
484
    int display_width, display_height;
485
486
    char *subtitles_enabled = (char*)alloca(this->context->nb_streams);
    char *subtitles_opened = (char*)alloca(this->context->nb_streams);
487
    int synced = this->start_time == 0.0;
488
    AVRational display_aspect_ratio, sample_aspect_ratio;
Jan Gerber's avatar
Jan Gerber committed
489

Jan Gerber's avatar
Jan Gerber committed
490
    if (this->audiostream >= 0 && this->context->nb_streams > this->audiostream) {
491
        AVCodecContext *enc = this->context->streams[this->audiostream]->codec;
492
493
        if (enc->codec_type == CODEC_TYPE_AUDIO) {
            this->audio_index = this->audiostream;
494
            fprintf(stderr, "  Using stream #0.%d as audio input\n",this->audio_index);
495
496
        }
        else {
497
            fprintf(stderr, "  The selected stream is not audio, falling back to automatic selection\n");
498
499
        }
    }
Jan Gerber's avatar
Jan Gerber committed
500
501
502
503
504
505
506
507
508
509
    if (this->videostream >= 0 && this->context->nb_streams > this->videostream) {
        AVCodecContext *enc = this->context->streams[this->videostream]->codec;
        if (enc->codec_type == CODEC_TYPE_VIDEO) {
            this->video_index = this->videostream;
            fprintf(stderr, "  Using stream #0.%d as video input\n",this->video_index);
        }
        else {
            fprintf(stderr, "  The selected stream is not video, falling back to automatic selection\n");
        }
    }
Jan Gerber's avatar
Jan Gerber committed
510

Jan Gerber's avatar
Jan Gerber committed
511
    for (i = 0; i < this->context->nb_streams; i++) {
512
        AVCodecContext *enc = this->context->streams[i]->codec;
Jan Gerber's avatar
Jan Gerber committed
513
        switch (enc->codec_type) {
514
            case CODEC_TYPE_VIDEO:
Jan Gerber's avatar
Jan Gerber committed
515
                if (this->video_index < 0 && !this->disable_video)
516
517
518
519
520
521
522
523
                    this->video_index = i;
                break;
            case CODEC_TYPE_AUDIO:
                if (this->audio_index < 0 && !this->disable_audio)
                    this->audio_index = i;
                break;
            default:
                break;
Jan Gerber's avatar
Jan Gerber committed
524
525
526
        }
    }

Jan Gerber's avatar
Jan Gerber committed
527
    if (this->video_index >= 0) {
Jan Gerber's avatar
Jan Gerber committed
528
        vstream = this->context->streams[this->video_index];
Jan Gerber's avatar
Jan Gerber committed
529
        venc = vstream->codec;
Jan Gerber's avatar
Jan Gerber committed
530
        vcodec = avcodec_find_decoder (venc->codec_id);
531
532
        display_width = venc->width;
        display_height = venc->height;
533
        venc_pix_fmt =  venc->pix_fmt;
Jan Gerber's avatar
Jan Gerber committed
534

535
536
537
        if (this->force_input_fps.num > 0)
            vstream_fps = this->force_input_fps;
        else if (vstream->time_base.den && vstream->time_base.num
538
539
                                  && av_q2d(vstream->time_base) > 0.001) {
            vstream_fps.num = vstream->time_base.den;
540
            vstream_fps.den = vstream->time_base.num;
541
        } else {
542
543
            vstream_fps.num = venc->time_base.den;
            vstream_fps.den = venc->time_base.num * venc->ticks_per_frame;
544
        }
545
546
        if (av_q2d(vstream->r_frame_rate) < av_q2d(vstream_fps)) {
            vstream_fps = vstream->r_frame_rate;
547
        }
548
549
        this->fps = fps = av_q2d(vstream_fps);
            
550
        if (vcodec == NULL || avcodec_open (venc, vcodec) < 0) {
Jan Gerber's avatar
Jan Gerber committed
551
            this->video_index = -1;
552
        }
Jan Gerber's avatar
Jan Gerber committed
553
        this->fps = fps;
554
555
556
557
558
559
560
#if DEBUG
        fprintf(stderr, "FPS1(stream): %f\n", 1/av_q2d(vstream->time_base));
        fprintf(stderr, "FPS2(stream.r_frame_rate): %f\n", av_q2d(vstream->r_frame_rate));
        fprintf(stderr, "FPS3(codec): %f\n", 1/av_q2d(venc->time_base));
        fprintf(stderr, "ticks per frame: %i\n", venc->ticks_per_frame);
        fprintf(stderr, "FPS used: %f\n", fps);
#endif
Jan Gerber's avatar
Jan Gerber committed
561
        if (this->picture_width && !this->picture_height) {
562
            this->picture_height = this->picture_width / ((double)display_width/display_height);
Jan Gerber's avatar
Jan Gerber committed
563
            this->picture_height = this->picture_height - this->picture_height%2;
564
        }
Jan Gerber's avatar
Jan Gerber committed
565
        if (this->picture_height && !this->picture_width) {
566
            this->picture_width = this->picture_height * ((double)display_width/display_height);
Jan Gerber's avatar
Jan Gerber committed
567
            this->picture_width = this->picture_width - this->picture_width%2;
568
        }
569

570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588

        if (this->picture_height==0 &&
            (this->frame_leftBand || this->frame_rightBand || this->frame_topBand || this->frame_bottomBand) ) {
            this->picture_height=display_height-
                    this->frame_topBand-this->frame_bottomBand;
        }
        if (this->picture_width==0 &&
            (this->frame_leftBand || this->frame_rightBand || this->frame_topBand || this->frame_bottomBand) ) {
            this->picture_width=display_width-
                    this->frame_leftBand-this->frame_rightBand;
        }

        //set display_aspect_ratio from source
        av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
                  venc->width*vstream->sample_aspect_ratio.num,
                  venc->height*vstream->sample_aspect_ratio.den,
                  1024*1024);

        if (vstream->sample_aspect_ratio.num && // default
589
            av_cmp_q(vstream->sample_aspect_ratio, venc->sample_aspect_ratio)) {
590
            sample_aspect_ratio = vstream->sample_aspect_ratio;
591
        } else {
592
            sample_aspect_ratio = venc->sample_aspect_ratio;
593
594
595
596
597
598
599
600
        }
        if (venc->sample_aspect_ratio.num) {
            av_reduce(&display_aspect_ratio.num, &display_aspect_ratio.den,
                      venc->width*venc->sample_aspect_ratio.num,
                      venc->height*venc->sample_aspect_ratio.den,
                      1024*1024);
        }

Jan Gerber's avatar
Jan Gerber committed
601
602
        if (this->preset == V2V_PRESET_PREVIEW) {
            if (abs(this->fps-30)<1 && (display_width!=NTSC_HALF_WIDTH || display_height!=NTSC_HALF_HEIGHT) ) {
603
604
                this->picture_width=NTSC_HALF_WIDTH;
                this->picture_height=NTSC_HALF_HEIGHT;
Jan Gerber's avatar
Jan Gerber committed
605
            }
Jan Gerber's avatar
Jan Gerber committed
606
607
608
609
            else {
                this->picture_width=PAL_HALF_WIDTH;
                this->picture_height=PAL_HALF_HEIGHT;
            }
Jan Gerber's avatar
Jan Gerber committed
610
        }
Jan Gerber's avatar
Jan Gerber committed
611
612
        else if (this->preset == V2V_PRESET_PRO) {
            if (abs(this->fps-30)<1 && (display_width!=NTSC_FULL_WIDTH || display_height!=NTSC_FULL_HEIGHT) ) {
613
614
                this->picture_width=NTSC_FULL_WIDTH;
                this->picture_height=NTSC_FULL_HEIGHT;
Jan Gerber's avatar
Jan Gerber committed
615
            }
Jan Gerber's avatar
Jan Gerber committed
616
617
618
619
            else {
                this->picture_width=PAL_FULL_WIDTH;
                this->picture_height=PAL_FULL_HEIGHT;
            }
Jan Gerber's avatar
Jan Gerber committed
620
        }
Jan Gerber's avatar
Jan Gerber committed
621
        else if (this->preset == V2V_PRESET_PADMA) {
622
623
            int width=display_width-this->frame_leftBand-this->frame_rightBand;
            int height=display_height-this->frame_topBand-this->frame_bottomBand;
624
625
626
627
            if (sample_aspect_ratio.den!=0 && sample_aspect_ratio.num!=0) {
                height=((float)sample_aspect_ratio.den/sample_aspect_ratio.num) * height;
                sample_aspect_ratio.den = 1;
                sample_aspect_ratio.num = 1;
Jan Gerber's avatar
Jan Gerber committed
628
            }
629
630
631
632
633
            if (this->frame_aspect.num == 0) {
                this->frame_aspect.num = width;
                this->frame_aspect.den = height;
            }
            if (av_q2d(this->frame_aspect) <= 1.5) {
Jan Gerber's avatar
Jan Gerber committed
634
635
636
637
638
639
640
641
642
                if (width > 640 || height > 480) {
                    //4:3 640 x 480
                    this->picture_width=640;
                    this->picture_height=480;
                }
                else {
                    this->picture_width=width;
                    this->picture_height=height;
                }
Jan Gerber's avatar
Jan Gerber committed
643
644
            }
            else {
Jan Gerber's avatar
Jan Gerber committed
645
646
647
648
649
650
651
652
653
                if (width > 640 || height > 360) {
                    //16:9 640 x 360
                    this->picture_width=640;
                    this->picture_height=360;
                }
                else {
                    this->picture_width=width;
                    this->picture_height=height;
                }
Jan Gerber's avatar
Jan Gerber committed
654
            }
655
656
            this->frame_aspect.num = this->picture_width;
            this->frame_aspect.den = this->picture_height;
Jan Gerber's avatar
Jan Gerber committed
657
        }
Jan Gerber's avatar
Jan Gerber committed
658
659
660
        else if (this->preset == V2V_PRESET_PADMASTREAM) {
            int width=display_width-this->frame_leftBand-this->frame_rightBand;
            int height=display_height-this->frame_topBand-this->frame_bottomBand;
661
662
663
664
            if (sample_aspect_ratio.den!=0 && sample_aspect_ratio.num!=0) {
                height=((float)sample_aspect_ratio.den/sample_aspect_ratio.num) * height;
                sample_aspect_ratio.den = 1;
                sample_aspect_ratio.num = 1;
Jan Gerber's avatar
Jan Gerber committed
665
            }
666
667
668
669
670
            if (this->frame_aspect.num == 0) {
                this->frame_aspect.num = width;
                this->frame_aspect.den = height;
            }
            if (av_q2d(this->frame_aspect) <= 1.5) {
Jan Gerber's avatar
Jan Gerber committed
671
672
673
674
675
676
677
                this->picture_width=128;
                this->picture_height=96;
            }
            else {
                this->picture_width=128;
                this->picture_height=72;
            }
Jan Gerber's avatar
Jan Gerber committed
678
679
            this->frame_aspect.num = this->picture_width;
            this->frame_aspect.den = this->picture_height;
Jan Gerber's avatar
Jan Gerber committed
680
681
682
683
        }
        else if (this->preset == V2V_PRESET_VIDEOBIN) {
            int width=display_width-this->frame_leftBand-this->frame_rightBand;
            int height=display_height-this->frame_topBand-this->frame_bottomBand;
684
685
686
687
            if (sample_aspect_ratio.den!=0 && sample_aspect_ratio.num!=0) {
                height=((float)sample_aspect_ratio.den/sample_aspect_ratio.num) * height;
                sample_aspect_ratio.den = 1;
                sample_aspect_ratio.num = 1;
Jan Gerber's avatar
Jan Gerber committed
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
            }
            if ( ((float)width /height) <= 1.5) {
                if (width > 448) {
                    //4:3 448 x 336
                    this->picture_width=448;
                    this->picture_height=336;
                }
                else {
                    this->picture_width=width;
                    this->picture_height=height;
                }
            }
            else {
                if (width > 512) {
                    //16:9 512 x 288
                    this->picture_width=512;
                    this->picture_height=288;
                }
                else {
                    this->picture_width=width;
                    this->picture_height=height;
                }
            }
Jan Gerber's avatar
Jan Gerber committed
711
712
            this->frame_aspect.num = this->picture_width;
            this->frame_aspect.den = this->picture_height;
Jan Gerber's avatar
Jan Gerber committed
713
        }
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
        //so frame_aspect is set on the commandline

        if (this->frame_aspect.num != 0) {
            if (this->picture_height) {
                this->aspect_numerator = this->frame_aspect.num*this->picture_height;
                this->aspect_denominator = this->frame_aspect.den*this->picture_width;
            }
            else{
                this->aspect_numerator = this->frame_aspect.num*display_height;
                this->aspect_denominator = this->frame_aspect.den*display_width;
            }
            av_reduce(&this->aspect_numerator,&this->aspect_denominator,
                       this->aspect_numerator,this->aspect_denominator,
                       1024*1024);
            frame_aspect=av_q2d(this->frame_aspect);
        }

731
        if (this->max_x > 0) {
Jan Gerber's avatar
Jan Gerber committed
732
733
            int width = display_width-this->frame_leftBand-this->frame_rightBand;
            int height = display_height-this->frame_topBand-this->frame_bottomBand;
734
735
736
737
            if (sample_aspect_ratio.den!=0 && sample_aspect_ratio.num!=0) {
                height=((float)sample_aspect_ratio.den/sample_aspect_ratio.num) * height;
                sample_aspect_ratio.den = 1;
                sample_aspect_ratio.num = 1;
Jan Gerber's avatar
Jan Gerber committed
738
            }
739
740
741
742
743
744
            if (this->frame_aspect.num == 0) {
                this->frame_aspect.num = width;
                this->frame_aspect.den = height;
            }
            if (width > height &&
                this->max_x/av_q2d(this->frame_aspect) <= this->max_y) {
745
                this->picture_width = this->max_x;
746
                this->picture_height = this->max_x / av_q2d(this->frame_aspect);
Jan Gerber's avatar
Jan Gerber committed
747
748
                this->picture_height = this->picture_height + this->picture_height%2;
            } else {
749
                this->picture_height = this->max_y;
750
                this->picture_width = this->max_y * av_q2d(this->frame_aspect);
Jan Gerber's avatar
Jan Gerber committed
751
752
                this->picture_width = this->picture_width + this->picture_width%2;
            }
753
        }
754

Jan Gerber's avatar
Jan Gerber committed
755
        if (this->no_upscaling) {
756
757
            if (this->picture_height && this->picture_height > display_height) {
                this->picture_width = display_height * display_aspect_ratio.num / display_aspect_ratio.den;
758
                this->picture_height = display_height;
759
            }
760
761
762
763
            else if (this->picture_width && this->picture_width > display_width) {
                this->picture_width = display_width;
                this->picture_height = display_width * display_aspect_ratio.den / display_aspect_ratio.num;
            }
764
765
            if (this->fps < av_q2d(this->framerate_new))
                this->framerate_new = vstream_fps;
766
767
        }

768
        if (sample_aspect_ratio.num!=0 && this->frame_aspect.num==0) {
769

Jan Gerber's avatar
Jan Gerber committed
770
            // just use the ratio from the input
771
772
            this->aspect_numerator=sample_aspect_ratio.num;
            this->aspect_denominator=sample_aspect_ratio.den;
Jan Gerber's avatar
Jan Gerber committed
773
            // or we use ratio for the output
Jan Gerber's avatar
Jan Gerber committed
774
            if (this->picture_height) {
775
776
                int width=display_width-this->frame_leftBand-this->frame_rightBand;
                int height=display_height-this->frame_topBand-this->frame_bottomBand;
Jan Gerber's avatar
Jan Gerber committed
777
                av_reduce(&this->aspect_numerator,&this->aspect_denominator,
Jan Gerber's avatar
Jan Gerber committed
778
779
                vstream->sample_aspect_ratio.num*width*this->picture_height,
                vstream->sample_aspect_ratio.den*height*this->picture_width,10000);
Jan Gerber's avatar
Jan Gerber committed
780
781
782
783
                frame_aspect=(float)(this->aspect_numerator*this->picture_width)/
                                (this->aspect_denominator*this->picture_height);
            }
            else{
784
785
                frame_aspect=(float)(this->aspect_numerator*display_width)/
                                (this->aspect_denominator*display_height);
Jan Gerber's avatar
Jan Gerber committed
786
787
            }
        }
788

789
790
791
792
793
794
795
796
797
798
799
800
801
        //pixel aspect ratio set, use that
        if (this->pixel_aspect.num>0) {
            this->aspect_numerator = this->pixel_aspect.num;
            this->aspect_denominator = this->pixel_aspect.den;
            if (this->picture_height) {
                frame_aspect=(float)(this->aspect_numerator*this->picture_width)/
                                (this->aspect_denominator*this->picture_height);
            }
            else{
                frame_aspect=(float)(this->aspect_numerator*display_width)/
                                (this->aspect_denominator*display_height);
            }
        }
802
        if (!(info.twopass==3 && info.passno==2) && !info.frontend && this->aspect_denominator && frame_aspect) {
803
            fprintf(stderr, "  Pixel Aspect Ratio: %.2f/1 ",(float)this->aspect_numerator/this->aspect_denominator);
Jan Gerber's avatar
Jan Gerber committed
804
            fprintf(stderr, "  Frame Aspect Ratio: %.2f/1\n", frame_aspect);
Jan Gerber's avatar
Jan Gerber committed
805
806
        }

807
        if (!(info.twopass==3 && info.passno==2) && !info.frontend && this->deinterlace==1)
808
            fprintf(stderr, "  Deinterlace: on\n");
809
810

        if (strcmp(this->pp_mode, "")) {
Jan Gerber's avatar
Jan Gerber committed
811
812
            ppContext = pp_get_context(display_width, display_height, PP_FORMAT_420);
            ppMode = pp_get_mode_by_name_and_quality(this->pp_mode, PP_QUALITY_MAX);
813
            if(!(info.twopass==3 && info.passno==2) && !info.frontend)
Jan Gerber's avatar
Jan Gerber committed
814
                fprintf(stderr, "  Postprocessing: %s\n", this->pp_mode);
815
816
        }

817
818
819
820
821
        if (venc->color_primaries == AVCOL_PRI_BT470M)
            this->colorspace = TH_CS_ITU_REC_470M;
        else if (venc->color_primaries == AVCOL_PRI_BT470BG)
            this->colorspace = TH_CS_ITU_REC_470BG;

Jan Gerber's avatar
Jan Gerber committed
822
        if (!this->picture_width)
823
            this->picture_width = display_width;
Jan Gerber's avatar
Jan Gerber committed
824
        if (!this->picture_height)
825
            this->picture_height = display_height;
826

827
828
829
830
        /* Theora has a divisible-by-sixteen restriction for the encoded video size */
        /* scale the frame size up to the nearest /16 and calculate offsets */
        this->frame_width = ((this->picture_width + 15) >>4)<<4;
        this->frame_height = ((this->picture_height + 15) >>4)<<4;
Jan Gerber's avatar
Jan Gerber committed
831

Jan Gerber's avatar
Jan Gerber committed
832
833
834
835
        /*Force the offsets to be even so that chroma samples line up like we
           expect.*/
        this->frame_x_offset = this->frame_width-this->picture_width>>1&~1;
        this->frame_y_offset = this->frame_height-this->picture_height>>1&~1;
Jan Gerber's avatar
Jan Gerber committed
836

837
838
839
840
841
842
843
844
        //Bicubic  (best for upscaling),
        if(display_width - (this->frame_leftBand + this->frame_rightBand) < this->picture_width |
           display_height - (this->frame_topBand + this->frame_bottomBand) < this->picture_height) {
           sws_flags = SWS_BICUBIC;
        } else {        //Bilinear (best for downscaling),
           sws_flags = SWS_BILINEAR;
        }

Jan Gerber's avatar
Jan Gerber committed
845
        if (this->frame_width > 0 || this->frame_height > 0) {
Jan Gerber's avatar
Jan Gerber committed
846
            this->sws_colorspace_ctx = sws_getContext(
847
                            display_width, display_height, venc_pix_fmt,
Jan Gerber's avatar
Jan Gerber committed
848
849
                            display_width, display_height, this->pix_fmt,
                            sws_flags, NULL, NULL, NULL
Jan Gerber's avatar
Jan Gerber committed
850
851
            );
            this->sws_scale_ctx = sws_getContext(
Jan Gerber's avatar
Jan Gerber committed
852
853
854
855
856
                        display_width - (this->frame_leftBand + this->frame_rightBand),
                        display_height - (this->frame_topBand + this->frame_bottomBand),
                        this->pix_fmt,
                        this->picture_width, this->picture_height, this->pix_fmt,
                        sws_flags, NULL, NULL, NULL
Jan Gerber's avatar
Jan Gerber committed
857
            );
Jan Gerber's avatar
Jan Gerber committed
858
            if (!info.frontend && !(info.twopass==3 && info.passno==2)) {
Jan Gerber's avatar
Jan Gerber committed
859
860
861
862
863
                if (this->frame_topBand || this->frame_bottomBand ||
                    this->frame_leftBand || this->frame_rightBand ||
                    this->picture_width != (display_width-this->frame_leftBand - this->frame_rightBand) ||
                    this->picture_height != (display_height-this->frame_topBand-this->frame_bottomBand))
                    fprintf(stderr, "  Resize: %dx%d", display_width, display_height);
Jan Gerber's avatar
Jan Gerber committed
864
865
866
867
868
869
870
871
872
873
                if (this->frame_topBand || this->frame_bottomBand ||
                    this->frame_leftBand || this->frame_rightBand) {
                    fprintf(stderr, " => %dx%d",
                        display_width-this->frame_leftBand-this->frame_rightBand,
                        display_height-this->frame_topBand-this->frame_bottomBand);
                }
                if (this->picture_width != (display_width-this->frame_leftBand - this->frame_rightBand)
                    || this->picture_height != (display_height-this->frame_topBand-this->frame_bottomBand))
                    fprintf(stderr, " => %dx%d",this->picture_width, this->picture_height);
                fprintf(stderr, "\n");
Jan Gerber's avatar
Jan Gerber committed
874
875
            }
        }
876

877
        lut_init(this);
Jan Gerber's avatar
Jan Gerber committed
878
    }
879
    if (!(info.twopass==3 && info.passno==2) && !info.frontend && this->framerate_new.num > 0 && av_cmp_q(vstream_fps, this->framerate_new)) {
Jan Gerber's avatar
Jan Gerber committed
880
        fprintf(stderr, "  Resample Framerate: %0.3f => %0.3f\n",
881
                        this->fps, av_q2d(this->framerate_new));
882
    }
Jan Gerber's avatar
Jan Gerber committed
883
    if (this->audio_index >= 0) {
Jan Gerber's avatar
Jan Gerber committed
884
        astream = this->context->streams[this->audio_index];
885
        aenc = this->context->streams[this->audio_index]->codec;
Jan Gerber's avatar
Jan Gerber committed
886
        acodec = avcodec_find_decoder (aenc->codec_id);
887
        if (this->channels < 1) {
888
            this->channels = aenc->channels;
889
        }
Jan Gerber's avatar
Jan Gerber committed
890
        if (this->sample_rate==-1) {
891
892
            this->sample_rate = aenc->sample_rate;
        }
Jan Gerber's avatar
Jan Gerber committed
893

Jan Gerber's avatar
Jan Gerber committed
894
895
        if (this->no_upscaling) {
            if (this->sample_rate > aenc->sample_rate)
896
                this->sample_rate = aenc->sample_rate;
Jan Gerber's avatar
Jan Gerber committed
897
            if (this->channels > aenc->channels)
898
899
900
                this->channels = aenc->channels;
        }

Jan Gerber's avatar
Jan Gerber committed
901
        if (acodec != NULL && avcodec_open (aenc, acodec) >= 0) {
902
903
904
            if (this->sample_rate != aenc->sample_rate
                || this->channels != aenc->channels
                || aenc->sample_fmt != SAMPLE_FMT_S16) {
905
906
907
908
909
910
911
912
                // values take from libavcodec/resample.c
                this->audio_resample_ctx = av_audio_resample_init(this->channels,    aenc->channels,
                                                                  this->sample_rate, aenc->sample_rate,
                                                                  SAMPLE_FMT_S16,    aenc->sample_fmt,
                                                                  16, 10, 0, 0.8);
                if (!this->audio_resample_ctx) {
                    this->channels = aenc->channels;
                }
Jan Gerber's avatar
Jan Gerber committed
913
                if (!info.frontend && this->sample_rate!=aenc->sample_rate)
914
                    fprintf(stderr, "  Resample: %dHz => %dHz\n",aenc->sample_rate,this->sample_rate);
Jan Gerber's avatar
Jan Gerber committed
915
                if (!info.frontend && this->channels!=aenc->channels)
916
                    fprintf(stderr, "  Channels: %d => %d\n",aenc->channels,this->channels);
Jan Gerber's avatar
Jan Gerber committed
917
918
919
920
921
922
923
924
925
            }
            else{
                this->audio_resample_ctx=NULL;
            }
        }
        else{
            this->audio_index = -1;
        }
    }
926

927
928
929
930
    if (info.passno != 1) {
      for (i = 0; i < this->context->nb_streams; i++) {
        subtitles_enabled[i] = 0;
        subtitles_opened[i] = 0;
931
#ifdef HAVE_KATE
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
        if (!this->disable_subtitles) {
          AVStream *stream = this->context->streams[i];
          AVCodecContext *enc = stream->codec;
          if (enc->codec_type == CODEC_TYPE_SUBTITLE) {
            AVCodec *codec = avcodec_find_decoder (enc->codec_id);
            if (codec && avcodec_open (enc, codec) >= 0) {
              subtitles_opened[i] = 1;
            }
            if (is_supported_subtitle_stream(this, i)) {
              subtitles_enabled[i] = 1;
              add_subtitles_stream(this, i, find_language_for_subtitle_stream(stream), NULL);
            }
            else if(!info.frontend) {
              fprintf(stderr,"Subtitle stream %d codec not supported, ignored\n", i);
            }
947
948
          }
        }
949
#endif
950
      }
951
952
    }

953
#ifdef HAVE_KATE
954
955
    if (info.passno != 1) {
      for (i=0; i<this->n_kate_streams; ++i) {
956
957
        ff2theora_kate_stream *ks=this->kate_streams+i;
        if (ks->stream_index >= 0) {
958
#ifdef DEBUG
959
960
            printf("Muxing Kate stream %d from input stream %d\n",
                i,ks->stream_index);
961
#endif
962
963
964
965
            if (!this->disable_subtitles) {
              info.with_kate=1;
            }
        }
Jan Gerber's avatar
Jan Gerber committed
966
        else if (load_subtitles(ks,this->ignore_non_utf8,info.frontend)>0) {
967
#ifdef DEBUG
968
969
970
971
            printf("Muxing Kate stream %d from %s as %s %s\n",
                i,ks->filename,
                ks->subtitles_language[0]?ks->subtitles_language:"<unknown language>",
                ks->subtitles_category[0]?ks->subtitles_category:"SUB");
972
#endif
973
974
975
976
977
978
979
980
        }
        else {
            if (i!=this->n_kate_streams) {
            memmove(this->kate_streams+i,this->kate_streams+i+1,(this->n_kate_streams-i-1)*sizeof(ff2theora_kate_stream));
            --this->n_kate_streams;
            --i;
          }
        }
981
      }
982
    }
983
#endif
984

985
986
987
    if (info.passno != 1) {
      oggmux_setup_kate_streams(&info, this->n_kate_streams);
    }
988

Jan Gerber's avatar
Jan Gerber committed
989
    if (this->video_index >= 0 || this->audio_index >= 0) {
Jan Gerber's avatar
Jan Gerber committed
990
        AVFrame *frame=NULL;
991
        AVFrame *frame_p=NULL;
Jan Gerber's avatar
Jan Gerber committed
992
        AVFrame *output=NULL;
993
994
        AVFrame *output_p=NULL;
        AVFrame *output_tmp_p=NULL;
Jan Gerber's avatar
Jan Gerber committed
995
        AVFrame *output_tmp=NULL;
996
        AVFrame *output_resized_p=NULL;
Jan Gerber's avatar
Jan Gerber committed
997
        AVFrame *output_resized=NULL;
998
        AVFrame *output_buffered_p=NULL;
Jan Gerber's avatar
Jan Gerber committed
999
        AVFrame *output_buffered=NULL;
1000
1001
        AVFrame *output_cropped_p=NULL;
        AVFrame *output_cropped=NULL;
Jan Gerber's avatar
Jan Gerber committed
1002
1003
        AVFrame *output_padded_p=NULL;
        AVFrame *output_padded=NULL;
Jan Gerber's avatar
Jan Gerber committed
1004

Jan Gerber's avatar
Jan Gerber committed
1005
        AVPacket pkt;
Jan Gerber's avatar
Jan Gerber committed
1006
        AVPacket avpkt;
Jan Gerber's avatar
Jan Gerber committed
1007
1008
1009
        int len1;
        int got_picture;
        int first = 1;
1010
        int audio_eos = 0, video_eos = 0, audio_done = 0, video_done = 0;
Jan Gerber's avatar
Jan Gerber committed
1011
        int ret;
1012
1013
        int16_t *audio_buf=av_malloc(4*AVCODEC_MAX_AUDIO_FRAME_SIZE);
        int16_t *resampled=av_malloc(4*AVCODEC_MAX_AUDIO_FRAME_SIZE);
Jan Gerber's avatar
Jan Gerber committed
1014
        int16_t *audio_p=NULL;
1015
        int no_frames;