OSDN Git Service

fix a problem with point-to-point (and live preview) when there are subtitles
[handbrake-jp/handbrake-jp-git.git] / libhb / decavcodec.c
1 /* $Id: decavcodec.c,v 1.6 2005/03/06 04:08:54 titer Exp $
2
3    This file is part of the HandBrake source code.
4    Homepage: <http://handbrake.fr/>.
5    It may be used under the terms of the GNU General Public License. */
6
7 /* This module is Handbrake's interface to the ffmpeg decoder library
8    (libavcodec & small parts of libavformat). It contains four Handbrake
9    "work objects":
10
11     decavcodec  connects HB to an ffmpeg audio decoder
12     decavcodecv connects HB to an ffmpeg video decoder
13
14         (Two different routines are needed because the ffmpeg library
15         has different decoder calling conventions for audio & video.
16         The audio decoder should have had its name changed to "decavcodeca"
17         but I got lazy.) These work objects are self-contained & follow all
18         of HB's conventions for a decoder module. They can be used like
19         any other HB decoder (deca52, decmpeg2, etc.).
20
21     decavcodecai "internal" (incestuous?) version of decavcodec
22     decavcodecvi "internal" (incestuous?) version of decavcodecv
23
24         These routine are functionally equivalent to the routines above but
25         can only be used by the ffmpeg-based stream reader in libhb/stream.c.
26         The reason they exist is because the ffmpeg library leaves some of
27         the information needed by the decoder in the AVStream (the data
28         structure used by the stream reader) and we need to retrieve it
29         to successfully decode frames. But in HB the reader and decoder
30         modules are in completely separate threads and nothing goes between
31         them but hb_buffers containing frames to be decoded. I.e., there's
32         no easy way for the ffmpeg stream reader to pass a pointer to its
33         AVStream over to the ffmpeg video or audio decoder. So the *i work
34         objects use a private back door to the stream reader to get access
35         to the AVStream (routines hb_ffmpeg_avstream and hb_ffmpeg_context)
36         and the codec_param passed to these work objects is the key to this
37         back door (it's basically an index that allows the correct AVStream
38         to be retrieved).
39
40     The normal & *i objects share a lot of code (the basic frame decoding
41     and bitstream info code is factored out into subroutines that can be
42     called by either) but the top level routines of the *i objects
43     (decavcodecviWork, decavcodecviInfo, etc.) are different because:
44      1) they *have* to use the AVCodecContext that's contained in the
45         reader's AVStream rather than just allocating & using their own,
46      2) the Info routines have access to stuff kept in the AVStream in addition
47         to stuff kept in the AVCodecContext. This shouldn't be necessary but
48         crucial information like video frame rate that should be in the
49         AVCodecContext is either missing or wrong in the version of ffmpeg
50         we're currently using.
51
52     A consequence of the above is that the non-i work objects *can't* use
53     information from the AVStream because there isn't one - they get their
54     data from either the dvd reader or the mpeg reader, not the ffmpeg stream
55     reader. That means that they have to make up for deficiencies in the
56     AVCodecContext info by using stuff kept in the HB "title" struct. It
57     also means that ffmpeg codecs that randomly scatter state needed by
58     the decoder across both the AVCodecContext & the AVStream (e.g., the
59     VC1 decoder) can't easily be used by the HB mpeg stream reader.
60  */
61
62 #include "hb.h"
63 #include "hbffmpeg.h"
64 #include "downmix.h"
65 #include "libavcodec/audioconvert.h"
66
67 static int  decavcodecInit( hb_work_object_t *, hb_job_t * );
68 static int  decavcodecWork( hb_work_object_t *, hb_buffer_t **, hb_buffer_t ** );
69 static void decavcodecClose( hb_work_object_t * );
70 static int decavcodecInfo( hb_work_object_t *, hb_work_info_t * );
71 static int decavcodecBSInfo( hb_work_object_t *, const hb_buffer_t *, hb_work_info_t * );
72
73 hb_work_object_t hb_decavcodec =
74 {
75     WORK_DECAVCODEC,
76     "MPGA decoder (libavcodec)",
77     decavcodecInit,
78     decavcodecWork,
79     decavcodecClose,
80     decavcodecInfo,
81     decavcodecBSInfo
82 };
83
84 #define HEAP_SIZE 8
85 typedef struct {
86     // there are nheap items on the heap indexed 1..nheap (i.e., top of
87     // heap is 1). The 0th slot is unused - a marker is put there to check
88     // for overwrite errs.
89     int64_t h[HEAP_SIZE+1];
90     int     nheap;
91 } pts_heap_t;
92
93 struct hb_work_private_s
94 {
95     hb_job_t        *job;
96     AVCodecContext  *context;
97     AVCodecParserContext *parser;
98     hb_list_t       *list;
99     double          duration;   // frame duration (for video)
100     double          pts_next;   // next pts we expect to generate
101     int64_t         pts;        // (video) pts passing from parser to decoder
102     int64_t         chap_time;  // time of next chap mark (if new_chap != 0)
103     int             new_chap;   // output chapter mark pending
104     uint32_t        nframes;
105     uint32_t        ndrops;
106     uint32_t        decode_errors;
107     int             brokenByMicrosoft; // video stream may contain packed b-frames
108     hb_buffer_t*    delayq[HEAP_SIZE];
109     pts_heap_t      pts_heap;
110     void*           buffer;
111     struct SwsContext *sws_context; // if we have to rescale or convert color space
112     hb_downmix_t    *downmix;
113     hb_sample_t     *downmix_buffer;
114 };
115
116 static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *data, int size );
117 static hb_buffer_t *link_buf_list( hb_work_private_t *pv );
118
119
120 static int64_t heap_pop( pts_heap_t *heap )
121 {
122     int64_t result;
123
124     if ( heap->nheap <= 0 )
125     {
126         return -1;
127     }
128
129     // return the top of the heap then put the bottom element on top,
130     // decrease the heap size by one & rebalence the heap.
131     result = heap->h[1];
132
133     int64_t v = heap->h[heap->nheap--];
134     int parent = 1;
135     int child = parent << 1;
136     while ( child <= heap->nheap )
137     {
138         // find the smallest of the two children of parent
139         if (child < heap->nheap && heap->h[child] > heap->h[child+1] )
140             ++child;
141
142         if (v <= heap->h[child])
143             // new item is smaller than either child so it's the new parent.
144             break;
145
146         // smallest child is smaller than new item so move it up then
147         // check its children.
148         int64_t hp = heap->h[child];
149         heap->h[parent] = hp;
150         parent = child;
151         child = parent << 1;
152     }
153     heap->h[parent] = v;
154     return result;
155 }
156
157 static void heap_push( pts_heap_t *heap, int64_t v )
158 {
159     if ( heap->nheap < HEAP_SIZE )
160     {
161         ++heap->nheap;
162     }
163
164     // stick the new value on the bottom of the heap then bubble it
165     // up to its correct spot.
166         int child = heap->nheap;
167         while (child > 1) {
168                 int parent = child >> 1;
169                 if (heap->h[parent] <= v)
170                         break;
171                 // move parent down
172                 int64_t hp = heap->h[parent];
173                 heap->h[child] = hp;
174                 child = parent;
175         }
176         heap->h[child] = v;
177 }
178
179
180 /***********************************************************************
181  * hb_work_decavcodec_init
182  ***********************************************************************
183  *
184  **********************************************************************/
185 static int decavcodecInit( hb_work_object_t * w, hb_job_t * job )
186 {
187     AVCodec * codec;
188
189     hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
190     w->private_data = pv;
191
192     pv->job   = job;
193     pv->list  = hb_list_init();
194
195     int codec_id = w->codec_param;
196     /*XXX*/
197     if ( codec_id == 0 )
198         codec_id = CODEC_ID_MP2;
199
200     codec = avcodec_find_decoder( codec_id );
201     pv->parser = av_parser_init( codec_id );
202
203     pv->context = avcodec_alloc_context();
204     hb_avcodec_open( pv->context, codec );
205
206     if ( w->audio != NULL &&
207          hb_need_downmix( w->audio->config.in.channel_layout, 
208                           w->audio->config.out.mixdown) )
209     {
210         pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout, 
211                                       w->audio->config.out.mixdown);
212         hb_downmix_set_chan_map( pv->downmix, &hb_smpte_chan_map, &hb_qt_chan_map );
213         if ( w->audio->config.out.codec == HB_ACODEC_LAME )
214             hb_downmix_adjust_level( pv->downmix );
215     }
216
217     return 0;
218 }
219
220 /***********************************************************************
221  * Close
222  ***********************************************************************
223  *
224  **********************************************************************/
225 static void decavcodecClose( hb_work_object_t * w )
226 {
227     hb_work_private_t * pv = w->private_data;
228
229     if ( pv )
230     {
231         if ( pv->job && pv->context && pv->context->codec )
232         {
233             hb_log( "%s-decoder done: %u frames, %u decoder errors, %u drops",
234                     pv->context->codec->name, pv->nframes, pv->decode_errors,
235                     pv->ndrops );
236         }
237         if ( pv->sws_context )
238         {
239             sws_freeContext( pv->sws_context );
240         }
241         if ( pv->parser )
242         {
243             av_parser_close(pv->parser);
244         }
245         if ( pv->context && pv->context->codec )
246         {
247             hb_avcodec_close( pv->context );
248         }
249         if ( pv->list )
250         {
251             hb_list_close( &pv->list );
252         }
253         if ( pv->buffer )
254         {
255             av_free( pv->buffer );
256             pv->buffer = NULL;
257         }
258         if ( pv->downmix )
259         {
260             hb_downmix_close( &(pv->downmix) );
261         }
262         if ( pv->downmix_buffer )
263         {
264             free( pv->downmix_buffer );
265             pv->downmix_buffer = NULL;
266         }
267         free( pv );
268         w->private_data = NULL;
269     }
270 }
271
272 /***********************************************************************
273  * Work
274  ***********************************************************************
275  *
276  **********************************************************************/
277 static int decavcodecWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
278                     hb_buffer_t ** buf_out )
279 {
280     hb_work_private_t * pv = w->private_data;
281     hb_buffer_t * in = *buf_in;
282
283     if ( in->size <= 0 )
284     {
285         /* EOF on input stream - send it downstream & say that we're done */
286         *buf_out = in;
287         *buf_in = NULL;
288         return HB_WORK_DONE;
289     }
290
291     *buf_out = NULL;
292
293     if ( in->start < -1 && pv->pts_next <= 0 )
294     {
295         // discard buffers that start before video time 0
296         return HB_WORK_OK;
297     }
298
299     // if the packet has a timestamp use it 
300     if ( in->start != -1 )
301     {
302         pv->pts_next = in->start;
303     }
304
305     int pos, len;
306     for ( pos = 0; pos < in->size; pos += len )
307     {
308         uint8_t *parser_output_buffer;
309         int parser_output_buffer_len;
310         int64_t cur = pv->pts_next;
311
312         if ( pv->parser != NULL )
313         {
314             len = av_parser_parse2( pv->parser, pv->context,
315                     &parser_output_buffer, &parser_output_buffer_len,
316                     in->data + pos, in->size - pos, cur, cur, AV_NOPTS_VALUE );
317         }
318         else
319         {
320             parser_output_buffer = in->data;
321             len = parser_output_buffer_len = in->size;
322         }
323         if (parser_output_buffer_len)
324         {
325             // set the duration on every frame since the stream format can
326             // change (it shouldn't but there's no way to guarantee it).
327             // duration is a scaling factor to go from #bytes in the decoded
328             // frame to frame time (in 90KHz mpeg ticks). 'channels' converts
329             // total samples to per-channel samples. 'sample_rate' converts
330             // per-channel samples to seconds per sample and the 90000
331             // is mpeg ticks per second.
332             if ( pv->context->sample_rate && pv->context->channels )
333             {
334                 pv->duration = 90000. /
335                             (double)( pv->context->sample_rate * pv->context->channels );
336             }
337             decodeAudio( w->audio, pv, parser_output_buffer, parser_output_buffer_len );
338         }
339     }
340     *buf_out = link_buf_list( pv );
341     return HB_WORK_OK;
342 }
343
344 static int decavcodecInfo( hb_work_object_t *w, hb_work_info_t *info )
345 {
346     hb_work_private_t *pv = w->private_data;
347
348     memset( info, 0, sizeof(*info) );
349
350     if ( pv && pv->context )
351     {
352         AVCodecContext *context = pv->context;
353         info->bitrate = context->bit_rate;
354         info->rate = context->time_base.num;
355         info->rate_base = context->time_base.den;
356         info->profile = context->profile;
357         info->level = context->level;
358         return 1;
359     }
360     return 0;
361 }
362
363 static int decavcodecBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
364                              hb_work_info_t *info )
365 {
366     hb_work_private_t *pv = w->private_data;
367     int ret = 0;
368
369     memset( info, 0, sizeof(*info) );
370
371     if ( pv && pv->context )
372     {
373         return decavcodecInfo( w, info );
374     }
375     // XXX
376     // We should parse the bitstream to find its parameters but for right
377     // now we just return dummy values if there's a codec that will handle it.
378     AVCodec *codec = avcodec_find_decoder( w->codec_param? w->codec_param :
379                                                            CODEC_ID_MP2 );
380     if ( ! codec )
381     {
382         // there's no ffmpeg codec for this audio type - give up
383         return -1;
384     }
385
386     static char codec_name[64];
387     info->name =  strncpy( codec_name, codec->name, sizeof(codec_name)-1 );
388
389     AVCodecParserContext *parser = av_parser_init( codec->id );
390     AVCodecContext *context = avcodec_alloc_context();
391     hb_avcodec_open( context, codec );
392     uint8_t *buffer = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
393     int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
394     unsigned char *pbuffer;
395     int pos, pbuffer_size;
396
397     while ( buf && !ret )
398     {
399         pos = 0;
400         while ( pos < buf->size )
401         {
402             int len;
403
404             if (parser != NULL )
405             {
406                 len = av_parser_parse2( parser, context, &pbuffer, 
407                                         &pbuffer_size, buf->data + pos, 
408                                         buf->size - pos, buf->start, 
409                                         buf->start, AV_NOPTS_VALUE );
410             }
411             else
412             {
413                 pbuffer = buf->data;
414                 len = pbuffer_size = buf->size;
415             }
416             pos += len;
417             if ( pbuffer_size > 0 )
418             {
419                 AVPacket avp;
420                 av_init_packet( &avp );
421                 avp.data = pbuffer;
422                 avp.size = pbuffer_size;
423
424                 len = avcodec_decode_audio3( context, (int16_t*)buffer, 
425                                              &out_size, &avp );
426                 if ( len > 0 && context->sample_rate > 0 )
427                 {
428                     info->bitrate = context->bit_rate;
429                     info->rate = context->sample_rate;
430                     info->rate_base = 1;
431                     info->channel_layout = 
432                         hb_ff_layout_xlat(context->channel_layout, 
433                                           context->channels);
434                     ret = 1;
435                     break;
436                 }
437             }
438         }
439         buf = buf->next;
440     }
441
442     av_free( buffer );
443     if ( parser != NULL )
444         av_parser_close( parser );
445     hb_avcodec_close( context );
446     return ret;
447 }
448
449 /* -------------------------------------------------------------
450  * General purpose video decoder using libavcodec
451  */
452
453 static uint8_t *copy_plane( uint8_t *dst, uint8_t* src, int dstride, int sstride,
454                             int h )
455 {
456     if ( dstride == sstride )
457     {
458         memcpy( dst, src, dstride * h );
459         return dst + dstride * h;
460     }
461     int lbytes = dstride <= sstride? dstride : sstride;
462     while ( --h >= 0 )
463     {
464         memcpy( dst, src, lbytes );
465         src += sstride;
466         dst += dstride;
467     }
468     return dst;
469 }
470
471 // copy one video frame into an HB buf. If the frame isn't in our color space
472 // or at least one of its dimensions is odd, use sws_scale to convert/rescale it.
473 // Otherwise just copy the bits.
474 static hb_buffer_t *copy_frame( hb_work_private_t *pv, AVFrame *frame )
475 {
476     AVCodecContext *context = pv->context;
477     int w, h;
478     if ( ! pv->job )
479     {
480         // if the dimensions are odd, drop the lsb since h264 requires that
481         // both width and height be even.
482         w = ( context->width >> 1 ) << 1;
483         h = ( context->height >> 1 ) << 1;
484     }
485     else
486     {
487         w =  pv->job->title->width;
488         h =  pv->job->title->height;
489     }
490     hb_buffer_t *buf = hb_video_buffer_init( w, h );
491     uint8_t *dst = buf->data;
492
493     if ( context->pix_fmt != PIX_FMT_YUV420P || w != context->width ||
494          h != context->height )
495     {
496         // have to convert to our internal color space and/or rescale
497         AVPicture dstpic;
498         avpicture_fill( &dstpic, dst, PIX_FMT_YUV420P, w, h );
499
500         if ( ! pv->sws_context )
501         {
502             pv->sws_context = sws_getContext( context->width, context->height, context->pix_fmt,
503                                               w, h, PIX_FMT_YUV420P,
504                                               SWS_LANCZOS|SWS_ACCURATE_RND,
505                                               NULL, NULL, NULL );
506         }
507         sws_scale( pv->sws_context, frame->data, frame->linesize, 0, h,
508                    dstpic.data, dstpic.linesize );
509     }
510     else
511     {
512         dst = copy_plane( dst, frame->data[0], w, frame->linesize[0], h );
513         w = (w + 1) >> 1; h = (h + 1) >> 1;
514         dst = copy_plane( dst, frame->data[1], w, frame->linesize[1], h );
515         dst = copy_plane( dst, frame->data[2], w, frame->linesize[2], h );
516     }
517     return buf;
518 }
519
520 static int get_frame_buf( AVCodecContext *context, AVFrame *frame )
521 {
522     hb_work_private_t *pv = context->opaque;
523     frame->pts = pv->pts;
524     pv->pts = -1;
525     return avcodec_default_get_buffer( context, frame );
526 }
527
528 static void log_chapter( hb_work_private_t *pv, int chap_num, int64_t pts )
529 {
530     hb_chapter_t *c = hb_list_item( pv->job->title->list_chapter, chap_num - 1 );
531     if ( c && c->title )
532     {
533         hb_log( "%s: \"%s\" (%d) at frame %u time %"PRId64,
534                 pv->context->codec->name, c->title, chap_num, pv->nframes, pts );
535     }
536     else
537     {
538         hb_log( "%s: Chapter %d at frame %u time %"PRId64,
539                 pv->context->codec->name, chap_num, pv->nframes, pts );
540     }
541 }
542
543 static void flushDelayQueue( hb_work_private_t *pv )
544 {
545     hb_buffer_t *buf;
546     int slot = pv->nframes & (HEAP_SIZE-1);
547
548     // flush all the video packets left on our timestamp-reordering delay q
549     while ( ( buf = pv->delayq[slot] ) != NULL )
550     {
551         buf->start = heap_pop( &pv->pts_heap );
552         hb_list_add( pv->list, buf );
553         pv->delayq[slot] = NULL;
554         slot = ( slot + 1 ) & (HEAP_SIZE-1);
555     }
556 }
557
558 static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
559 {
560     int got_picture, oldlevel = 0;
561     AVFrame frame;
562     AVPacket avp;
563
564     if ( global_verbosity_level <= 1 )
565     {
566         oldlevel = av_log_get_level();
567         av_log_set_level( AV_LOG_QUIET );
568     }
569
570     av_init_packet( &avp );
571     avp.data = data;
572     avp.size = size;
573     if ( avcodec_decode_video2( pv->context, &frame, &got_picture, &avp ) < 0 )
574     {
575         ++pv->decode_errors;     
576     }
577     if ( global_verbosity_level <= 1 )
578     {
579         av_log_set_level( oldlevel );
580     }
581     if( got_picture )
582     {
583         // ffmpeg makes it hard to attach a pts to a frame. if the MPEG ES
584         // packet had a pts we handed it to av_parser_parse (if the packet had
585         // no pts we set it to -1 but before the parse we can't distinguish between
586         // the start of a video frame with no pts & an intermediate packet of
587         // some frame which never has a pts). we hope that when parse returns
588         // the frame to us the pts we originally handed it will be in parser->pts.
589         // we put this pts into pv->pts so that when a avcodec_decode_video
590         // finally gets around to allocating an AVFrame to hold the decoded
591         // frame we can stuff that pts into the frame. if all of these relays
592         // worked at this point frame.pts should hold the frame's pts from the
593         // original data stream or -1 if it didn't have one. in the latter case
594         // we generate the next pts in sequence for it.
595         double frame_dur = pv->duration;
596         if ( frame_dur <= 0 )
597         {
598             frame_dur = 90000. * (double)pv->context->time_base.num /
599                         (double)pv->context->time_base.den;
600             pv->duration = frame_dur;
601         }
602         if ( frame.repeat_pict )
603         {
604             frame_dur += frame.repeat_pict * frame_dur * 0.5;
605         }
606         // XXX Unlike every other video decoder, the Raw decoder doesn't
607         //     use the standard buffer allocation routines so we never
608         //     get to put a PTS in the frame. Do it now.
609         if ( pv->context->codec_id == CODEC_ID_RAWVIDEO )
610         {
611             frame.pts = pv->pts;
612             pv->pts = -1;
613         }
614         // If there was no pts for this frame, assume constant frame rate
615         // video & estimate the next frame time from the last & duration.
616         double pts = frame.pts;
617         if ( pts < 0 )
618         {
619             pts = pv->pts_next;
620         }
621         pv->pts_next = pts + frame_dur;
622
623         hb_buffer_t *buf;
624
625         // if we're doing a scan or this content couldn't have been broken
626         // by Microsoft we don't worry about timestamp reordering
627         if ( ! pv->job || ! pv->brokenByMicrosoft )
628         {
629             buf = copy_frame( pv, &frame );
630             buf->start = pts;
631             hb_list_add( pv->list, buf );
632             ++pv->nframes;
633             return got_picture;
634         }
635
636         // XXX This following probably addresses a libavcodec bug but I don't
637         //     see an easy fix so we workaround it here.
638         //
639         // The M$ 'packed B-frames' atrocity results in decoded frames with
640         // the wrong timestamp. E.g., if there are 2 b-frames the timestamps
641         // we see here will be "2 3 1 5 6 4 ..." instead of "1 2 3 4 5 6".
642         // The frames are actually delivered in the right order but with
643         // the wrong timestamp. To get the correct timestamp attached to
644         // each frame we have a delay queue (longer than the max number of
645         // b-frames) & a sorting heap for the timestamps. As each frame
646         // comes out of the decoder the oldest frame in the queue is removed
647         // and associated with the smallest timestamp. Then the new frame is
648         // added to the queue & its timestamp is pushed on the heap.
649         // This does nothing if the timestamps are correct (i.e., the video
650         // uses a codec that Micro$oft hasn't broken yet) but the frames
651         // get timestamped correctly even when M$ has munged them.
652
653         // remove the oldest picture from the frame queue (if any) &
654         // give it the smallest timestamp from our heap. The queue size
655         // is a power of two so we get the slot of the oldest by masking
656         // the frame count & this will become the slot of the newest
657         // once we've removed & processed the oldest.
658         int slot = pv->nframes & (HEAP_SIZE-1);
659         if ( ( buf = pv->delayq[slot] ) != NULL )
660         {
661             buf->start = heap_pop( &pv->pts_heap );
662
663             if ( pv->new_chap && buf->start >= pv->chap_time )
664             {
665                 buf->new_chap = pv->new_chap;
666                 pv->new_chap = 0;
667                 pv->chap_time = 0;
668                 log_chapter( pv, buf->new_chap, buf->start );
669             }
670             else if ( pv->nframes == 0 )
671             {
672                 log_chapter( pv, pv->job->chapter_start, buf->start );
673             }
674             hb_list_add( pv->list, buf );
675         }
676
677         // add the new frame to the delayq & push its timestamp on the heap
678         pv->delayq[slot] = copy_frame( pv, &frame );
679         heap_push( &pv->pts_heap, pts );
680
681         ++pv->nframes;
682     }
683
684     return got_picture;
685 }
686
687 static void decodeVideo( hb_work_private_t *pv, uint8_t *data, int size,
688                          int64_t pts, int64_t dts )
689 {
690     /*
691      * The following loop is a do..while because we need to handle both
692      * data & the flush at the end (signaled by size=0). At the end there's
693      * generally a frame in the parser & one or more frames in the decoder
694      * (depending on the bframes setting).
695      */
696     int pos = 0;
697     do {
698         uint8_t *pout;
699         int pout_len;
700         int len = av_parser_parse2( pv->parser, pv->context, &pout, &pout_len,
701                                     data + pos, size - pos, pts, dts, AV_NOPTS_VALUE );
702         pos += len;
703
704         if ( pout_len > 0 )
705         {
706             pv->pts = pv->parser->pts;
707             decodeFrame( pv, pout, pout_len );
708         }
709     } while ( pos < size );
710
711     /* the stuff above flushed the parser, now flush the decoder */
712     if ( size <= 0 )
713     {
714         while ( decodeFrame( pv, NULL, 0 ) )
715         {
716         }
717         flushDelayQueue( pv );
718     }
719 }
720
721 static hb_buffer_t *link_buf_list( hb_work_private_t *pv )
722 {
723     hb_buffer_t *head = hb_list_item( pv->list, 0 );
724
725     if ( head )
726     {
727         hb_list_rem( pv->list, head );
728
729         hb_buffer_t *last = head, *buf;
730
731         while ( ( buf = hb_list_item( pv->list, 0 ) ) != NULL )
732         {
733             hb_list_rem( pv->list, buf );
734             last->next = buf;
735             last = buf;
736         }
737     }
738     return head;
739 }
740
741
742 static int decavcodecvInit( hb_work_object_t * w, hb_job_t * job )
743 {
744
745     hb_work_private_t *pv = calloc( 1, sizeof( hb_work_private_t ) );
746     w->private_data = pv;
747     pv->job   = job;
748     pv->list = hb_list_init();
749
750     int codec_id = w->codec_param;
751     pv->parser = av_parser_init( codec_id );
752     pv->context = avcodec_alloc_context2( CODEC_TYPE_VIDEO );
753
754     /* we have to wrap ffmpeg's get_buffer to be able to set the pts (?!) */
755     pv->context->opaque = pv;
756     pv->context->get_buffer = get_frame_buf;
757
758     return 0;
759 }
760
761 static int next_hdr( hb_buffer_t *in, int offset )
762 {
763     uint8_t *dat = in->data;
764     uint16_t last2 = 0xffff;
765     for ( ; in->size - offset > 1; ++offset )
766     {
767         if ( last2 == 0 && dat[offset] == 0x01 )
768             // found an mpeg start code
769             return offset - 2;
770
771         last2 = ( last2 << 8 ) | dat[offset];
772     }
773
774     return -1;
775 }
776
777 static int find_hdr( hb_buffer_t *in, int offset, uint8_t hdr_type )
778 {
779     if ( in->size - offset < 4 )
780         // not enough room for an mpeg start code
781         return -1;
782
783     for ( ; ( offset = next_hdr( in, offset ) ) >= 0; ++offset )
784     {
785         if ( in->data[offset+3] == hdr_type )
786             // found it
787             break;
788     }
789     return offset;
790 }
791
792 static int setup_extradata( hb_work_object_t *w, hb_buffer_t *in )
793 {
794     hb_work_private_t *pv = w->private_data;
795
796     // we can't call the avstream funcs but the read_header func in the
797     // AVInputFormat may set up some state in the AVContext. In particular 
798     // vc1t_read_header allocates 'extradata' to deal with header issues
799     // related to Microsoft's bizarre engineering notions. We alloc a chunk
800     // of space to make vc1 work then associate the codec with the context.
801     if ( w->codec_param != CODEC_ID_VC1 )
802     {
803         // we haven't been inflicted with M$ - allocate a little space as
804         // a marker and return success.
805         pv->context->extradata_size = 16;
806         pv->context->extradata = av_malloc(pv->context->extradata_size);
807         return 0;
808     }
809
810     // find the start and and of the sequence header
811     int shdr, shdr_end;
812     if ( ( shdr = find_hdr( in, 0, 0x0f ) ) < 0 )
813     {
814         // didn't find start of seq hdr
815         return 1;
816     }
817     if ( ( shdr_end = next_hdr( in, shdr + 4 ) ) < 0 )
818     {
819         shdr_end = in->size;
820     }
821     shdr_end -= shdr;
822
823     // find the start and and of the entry point header
824     int ehdr, ehdr_end;
825     if ( ( ehdr = find_hdr( in, 0, 0x0e ) ) < 0 )
826     {
827         // didn't find start of entry point hdr
828         return 1;
829     }
830     if ( ( ehdr_end = next_hdr( in, ehdr + 4 ) ) < 0 )
831     {
832         ehdr_end = in->size;
833     }
834     ehdr_end -= ehdr;
835
836     // found both headers - allocate an extradata big enough to hold both
837     // then copy them into it.
838     pv->context->extradata_size = shdr_end + ehdr_end;
839     pv->context->extradata = av_malloc(pv->context->extradata_size + 8);
840     memcpy( pv->context->extradata, in->data + shdr, shdr_end );
841     memcpy( pv->context->extradata + shdr_end, in->data + ehdr, ehdr_end );
842     memset( pv->context->extradata + shdr_end + ehdr_end, 0, 8);
843     return 0;
844 }
845
846 static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
847                             hb_buffer_t ** buf_out )
848 {
849     hb_work_private_t *pv = w->private_data;
850     hb_buffer_t *in = *buf_in;
851     int64_t pts = AV_NOPTS_VALUE;
852     int64_t dts = pts;
853
854     *buf_in = NULL;
855
856     /* if we got an empty buffer signaling end-of-stream send it downstream */
857     if ( in->size == 0 )
858     {
859         decodeVideo( pv, in->data, in->size, pts, dts );
860         hb_list_add( pv->list, in );
861         *buf_out = link_buf_list( pv );
862         return HB_WORK_DONE;
863     }
864
865     // if this is the first frame open the codec (we have to wait for the
866     // first frame because of M$ VC1 braindamage).
867     if ( pv->context->extradata_size == 0 )
868     {
869         if ( setup_extradata( w, in ) )
870         {
871             // we didn't find the headers needed to set up extradata.
872             // the codec will abort if we open it so just free the buf
873             // and hope we eventually get the info we need.
874             hb_buffer_close( &in );
875             return HB_WORK_OK;
876         }
877         AVCodec *codec = avcodec_find_decoder( w->codec_param );
878         // There's a mis-feature in ffmpeg that causes the context to be 
879         // incorrectly initialized the 1st time avcodec_open is called.
880         // If you close it and open a 2nd time, it finishes the job.
881         hb_avcodec_open( pv->context, codec );
882         hb_avcodec_close( pv->context );
883         hb_avcodec_open( pv->context, codec );
884     }
885
886     if( in->start >= 0 )
887     {
888         pts = in->start;
889         dts = in->renderOffset;
890     }
891     if ( in->new_chap )
892     {
893         pv->new_chap = in->new_chap;
894         pv->chap_time = pts >= 0? pts : pv->pts_next;
895     }
896     decodeVideo( pv, in->data, in->size, pts, dts );
897     hb_buffer_close( &in );
898     *buf_out = link_buf_list( pv );
899     return HB_WORK_OK;
900 }
901
902 static int decavcodecvInfo( hb_work_object_t *w, hb_work_info_t *info )
903 {
904     hb_work_private_t *pv = w->private_data;
905
906     memset( info, 0, sizeof(*info) );
907
908     if ( pv && pv->context )
909     {
910         AVCodecContext *context = pv->context;
911         info->bitrate = context->bit_rate;
912         info->width = context->width;
913         info->height = context->height;
914
915         /* ffmpeg gives the frame rate in frames per second while HB wants
916          * it in units of the 27MHz MPEG clock. */
917         info->rate = 27000000;
918         info->rate_base = (int64_t)context->time_base.num * 27000000LL /
919                           context->time_base.den;
920         if ( context->ticks_per_frame > 1 )
921         {
922             // for ffmpeg 0.5 & later, the H.264 & MPEG-2 time base is
923             // field rate rather than frame rate so convert back to frames.
924             info->rate_base *= context->ticks_per_frame;
925         }
926         
927         info->pixel_aspect_width = context->sample_aspect_ratio.num;
928         info->pixel_aspect_height = context->sample_aspect_ratio.den;
929
930         /* Sometimes there's no pixel aspect set in the source ffmpeg context
931          * which appears to come from the video stream. In that case,
932          * try the pixel aspect in AVStream (which appears to come from
933          * the container). Else assume a 1:1 PAR. */
934         if ( info->pixel_aspect_width == 0 ||
935              info->pixel_aspect_height == 0 )
936         {
937             AVStream *st = hb_ffmpeg_avstream( w->codec_param );
938             info->pixel_aspect_width = st->sample_aspect_ratio.num ?
939                                         st->sample_aspect_ratio.num : 1;
940             info->pixel_aspect_height = st->sample_aspect_ratio.den ?
941                                         st->sample_aspect_ratio.den : 1;
942         }
943         /* ffmpeg returns the Pixel Aspect Ratio (PAR). Handbrake wants the
944          * Display Aspect Ratio so we convert by scaling by the Storage
945          * Aspect Ratio (w/h). We do the calc in floating point to get the
946          * rounding right. */
947         info->aspect = (double)info->pixel_aspect_width * 
948                        (double)context->width /
949                        (double)info->pixel_aspect_height /
950                        (double)context->height;
951
952         info->profile = context->profile;
953         info->level = context->level;
954         info->name = context->codec->name;
955         return 1;
956     }
957     return 0;
958 }
959
960 static int decavcodecvBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
961                              hb_work_info_t *info )
962 {
963     return 0;
964 }
965
966 hb_work_object_t hb_decavcodecv =
967 {
968     WORK_DECAVCODECV,
969     "Video decoder (libavcodec)",
970     decavcodecvInit,
971     decavcodecvWork,
972     decavcodecClose,
973     decavcodecvInfo,
974     decavcodecvBSInfo
975 };
976
977
978 // This is a special decoder for ffmpeg streams. The ffmpeg stream reader
979 // includes a parser and passes information from the parser to the decoder
980 // via a codec context kept in the AVStream of the reader's AVFormatContext.
981 // We *have* to use that codec context to decode the stream or we'll get
982 // garbage. ffmpeg_title_scan put a cookie that can be used to get to that
983 // codec context in our codec_param.
984
985 // this routine gets the appropriate context pointer from the ffmpeg
986 // stream reader. it can't be called until we get the first buffer because
987 // we can't guarantee that reader will be called before the our init
988 // routine and if our init is called first we'll get a pointer to the
989 // old scan stream (which has already been closed).
990 static void init_ffmpeg_context( hb_work_object_t *w )
991 {
992     hb_work_private_t *pv = w->private_data;
993     pv->context = hb_ffmpeg_context( w->codec_param );
994
995     // during scan the decoder gets closed & reopened which will
996     // close the codec so reopen it if it's not there
997     if ( ! pv->context->codec )
998     {
999         AVCodec *codec = avcodec_find_decoder( pv->context->codec_id );
1000         hb_avcodec_open( pv->context, codec );
1001     }
1002     // set up our best guess at the frame duration.
1003     // the frame rate in the codec is usually bogus but it's sometimes
1004     // ok in the stream.
1005     AVStream *st = hb_ffmpeg_avstream( w->codec_param );
1006
1007     if ( st->nb_frames && st->duration )
1008     {
1009         // compute the average frame duration from the total number
1010         // of frames & the total duration.
1011         pv->duration = ( (double)st->duration * (double)st->time_base.num ) /
1012                        ( (double)st->nb_frames * (double)st->time_base.den );
1013     }
1014     else
1015     {
1016         // XXX We don't have a frame count or duration so try to use the
1017         // far less reliable time base info in the stream.
1018         // Because the time bases are so screwed up, we only take values
1019         // in the range 8fps - 64fps.
1020         AVRational tb;
1021         if ( st->time_base.num * 64 > st->time_base.den &&
1022              st->time_base.den > st->time_base.num * 8 )
1023         {
1024             tb = st->time_base;
1025         }
1026         else if ( st->r_frame_rate.den * 64 > st->r_frame_rate.num &&
1027                   st->r_frame_rate.num > st->r_frame_rate.den * 8 )
1028         {
1029             tb.num = st->r_frame_rate.den;
1030             tb.den = st->r_frame_rate.num;
1031         }
1032         else
1033         {
1034             tb.num = 1001;  /*XXX*/
1035             tb.den = 24000; /*XXX*/
1036         }
1037         pv->duration =  (double)tb.num / (double)tb.den;
1038     }
1039     pv->duration *= 90000.;
1040
1041     // we have to wrap ffmpeg's get_buffer to be able to set the pts (?!)
1042     pv->context->opaque = pv;
1043     pv->context->get_buffer = get_frame_buf;
1044
1045     // avi, mkv and possibly mp4 containers can contain the M$ VFW packed
1046     // b-frames abortion that messes up frame ordering and timestamps.
1047     // XXX ffmpeg knows which streams are broken but doesn't expose the
1048     //     info externally. We should patch ffmpeg to add a flag to the
1049     //     codec context for this but until then we mark all ffmpeg streams
1050     //     as suspicious.
1051     pv->brokenByMicrosoft = 1;
1052 }
1053
1054 static void prepare_ffmpeg_buffer( hb_buffer_t * in )
1055 {
1056     // ffmpeg requires an extra 8 bytes of zero at the end of the buffer and
1057     // will seg fault in odd, data dependent ways if it's not there. (my guess
1058     // is this is a case of a local performance optimization creating a global
1059     // performance degradation since all the time wasted by extraneous data
1060     // copies & memory zeroing has to be huge compared to the minor reduction
1061     // in inner-loop instructions this affords - modern cpus bottleneck on
1062     // memory bandwidth not instruction bandwidth).
1063     if ( in->size + FF_INPUT_BUFFER_PADDING_SIZE > in->alloc )
1064     {
1065         // have to realloc to add the padding
1066         hb_buffer_realloc( in, in->size + FF_INPUT_BUFFER_PADDING_SIZE );
1067     }
1068     memset( in->data + in->size, 0, FF_INPUT_BUFFER_PADDING_SIZE );
1069 }
1070
1071 static int decavcodecviInit( hb_work_object_t * w, hb_job_t * job )
1072 {
1073
1074     hb_work_private_t *pv = calloc( 1, sizeof( hb_work_private_t ) );
1075     w->private_data = pv;
1076     pv->job   = job;
1077     pv->list = hb_list_init();
1078     pv->pts_next = -1;
1079     pv->pts = -1;
1080
1081     if ( w->audio != NULL &&
1082          hb_need_downmix( w->audio->config.in.channel_layout, 
1083                           w->audio->config.out.mixdown) )
1084     {
1085         pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout, 
1086                                       w->audio->config.out.mixdown);
1087         hb_downmix_set_chan_map( pv->downmix, &hb_smpte_chan_map, &hb_qt_chan_map );
1088         if ( w->audio->config.out.codec == HB_ACODEC_LAME )
1089             hb_downmix_adjust_level( pv->downmix );
1090     }
1091
1092     return 0;
1093 }
1094
1095 static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
1096                              hb_buffer_t ** buf_out )
1097 {
1098     hb_work_private_t *pv = w->private_data;
1099     hb_buffer_t *in = *buf_in;
1100     *buf_in = NULL;
1101
1102     /* if we got an empty buffer signaling end-of-stream send it downstream */
1103     if ( in->size == 0 )
1104     {
1105         /* flush any frames left in the decoder */
1106         while ( pv->context && decodeFrame( pv, NULL, 0 ) )
1107         {
1108         }
1109         flushDelayQueue( pv );
1110         hb_list_add( pv->list, in );
1111         *buf_out = link_buf_list( pv );
1112         return HB_WORK_DONE;
1113     }
1114
1115     if ( ! pv->context )
1116     {
1117         init_ffmpeg_context( w );
1118     }
1119
1120     int64_t pts = in->start;
1121     if( pts >= 0 )
1122     {
1123         // use the first timestamp as our 'next expected' pts
1124         if ( pv->pts_next < 0 )
1125         {
1126             pv->pts_next = pts;
1127         }
1128         pv->pts = pts;
1129     }
1130
1131     if ( in->new_chap )
1132     {
1133         pv->new_chap = in->new_chap;
1134         pv->chap_time = pts >= 0? pts : pv->pts_next;
1135     }
1136     prepare_ffmpeg_buffer( in );
1137     decodeFrame( pv, in->data, in->size );
1138     hb_buffer_close( &in );
1139     *buf_out = link_buf_list( pv );
1140     return HB_WORK_OK;
1141 }
1142
1143 static int decavcodecviInfo( hb_work_object_t *w, hb_work_info_t *info )
1144 {
1145     if ( decavcodecvInfo( w, info ) )
1146     {
1147         hb_work_private_t *pv = w->private_data;
1148         if ( ! pv->context )
1149         {
1150             init_ffmpeg_context( w );
1151         }
1152         // we have the frame duration in units of the 90KHz pts clock but
1153         // need it in units of the 27MHz MPEG clock. */
1154         info->rate = 27000000;
1155         info->rate_base = pv->duration * 300.;
1156         return 1;
1157     }
1158     return 0;
1159 }
1160
1161 static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *data, int size )
1162 {
1163     AVCodecContext *context = pv->context;
1164     int pos = 0;
1165
1166     while ( pos < size )
1167     {
1168         int16_t *buffer = pv->buffer;
1169         if ( buffer == NULL )
1170         {
1171             pv->buffer = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
1172             buffer = pv->buffer;
1173         }
1174
1175         AVPacket avp;
1176         av_init_packet( &avp );
1177         avp.data = data + pos;
1178         avp.size = size - pos;
1179
1180         int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
1181         int nsamples;
1182         int len = avcodec_decode_audio3( context, buffer, &out_size, &avp );
1183         if ( len <= 0 )
1184         {
1185             return;
1186         }
1187         pos += len;
1188         if( out_size > 0 )
1189         {
1190             // We require signed 16-bit ints for the output format. If
1191             // we got something different convert it.
1192             if ( context->sample_fmt != SAMPLE_FMT_S16 )
1193             {
1194                 // Note: av_audio_convert seems to be a work-in-progress but
1195                 //       looks like it will eventually handle general audio
1196                 //       mixdowns which would allow us much more flexibility
1197                 //       in handling multichannel audio in HB. If we were doing
1198                 //       anything more complicated than a one-for-one format
1199                 //       conversion we'd probably want to cache the converter
1200                 //       context in the pv.
1201                 int isamp = av_get_bits_per_sample_format( context->sample_fmt ) / 8;
1202                 AVAudioConvert *ctx = av_audio_convert_alloc( SAMPLE_FMT_S16, 1,
1203                                                               context->sample_fmt, 1,
1204                                                               NULL, 0 );
1205                 // get output buffer size (in 2-byte samples) then malloc a buffer
1206                 nsamples = out_size / isamp;
1207                 buffer = av_malloc( nsamples * 2 );
1208
1209                 // we're doing straight sample format conversion which behaves as if
1210                 // there were only one channel.
1211                 const void * const ibuf[6] = { pv->buffer };
1212                 void * const obuf[6] = { buffer };
1213                 const int istride[6] = { isamp };
1214                 const int ostride[6] = { 2 };
1215
1216                 av_audio_convert( ctx, obuf, ostride, ibuf, istride, nsamples );
1217                 av_audio_convert_free( ctx );
1218             }
1219             else
1220             {
1221                 nsamples = out_size / 2;
1222             }
1223
1224             hb_buffer_t * buf;
1225
1226             if ( pv->downmix )
1227             {
1228                 pv->downmix_buffer = realloc(pv->downmix_buffer, nsamples * sizeof(hb_sample_t));
1229                 
1230                 int i;
1231                 for( i = 0; i < nsamples; ++i )
1232                 {
1233                     pv->downmix_buffer[i] = buffer[i];
1234                 }
1235
1236                 int n_ch_samples = nsamples / context->channels;
1237                 int channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
1238
1239                 buf = hb_buffer_init( n_ch_samples * channels * sizeof(float) );
1240                 hb_sample_t *samples = (hb_sample_t *)buf->data;
1241                 hb_downmix(pv->downmix, samples, pv->downmix_buffer, n_ch_samples);
1242             }
1243             else
1244             {
1245                 buf = hb_buffer_init( nsamples * sizeof(float) );
1246                 float *fl32 = (float *)buf->data;
1247                 int i;
1248                 for( i = 0; i < nsamples; ++i )
1249                 {
1250                     fl32[i] = buffer[i];
1251                 }
1252                 int n_ch_samples = nsamples / context->channels;
1253                 hb_layout_remap( &hb_smpte_chan_map, &hb_qt_chan_map,
1254                                  audio->config.in.channel_layout, 
1255                                  fl32, n_ch_samples );
1256             }
1257
1258             double pts = pv->pts_next;
1259             buf->start = pts;
1260             pts += nsamples * pv->duration;
1261             buf->stop  = pts;
1262             pv->pts_next = pts;
1263
1264             hb_list_add( pv->list, buf );
1265
1266             // if we allocated a buffer for sample format conversion, free it
1267             if ( buffer != pv->buffer )
1268             {
1269                 av_free( buffer );
1270             }
1271         }
1272     }
1273 }
1274
1275 static int decavcodecaiWork( hb_work_object_t *w, hb_buffer_t **buf_in,
1276                     hb_buffer_t **buf_out )
1277 {
1278     if ( (*buf_in)->size <= 0 )
1279     {
1280         /* EOF on input stream - send it downstream & say that we're done */
1281         *buf_out = *buf_in;
1282         *buf_in = NULL;
1283         return HB_WORK_DONE;
1284     }
1285
1286     hb_work_private_t *pv = w->private_data;
1287
1288     if ( (*buf_in)->start < -1 && pv->pts_next <= 0 )
1289     {
1290         // discard buffers that start before video time 0
1291         *buf_out = NULL;
1292         return HB_WORK_OK;
1293     }
1294
1295     if ( ! pv->context )
1296     {
1297         init_ffmpeg_context( w );
1298         // duration is a scaling factor to go from #bytes in the decoded
1299         // frame to frame time (in 90KHz mpeg ticks). 'channels' converts
1300         // total samples to per-channel samples. 'sample_rate' converts
1301         // per-channel samples to seconds per sample and the 90000
1302         // is mpeg ticks per second.
1303         pv->duration = 90000. /
1304                     (double)( pv->context->sample_rate * pv->context->channels );
1305     }
1306     hb_buffer_t *in = *buf_in;
1307
1308     // if the packet has a timestamp use it if we don't have a timestamp yet
1309     // or if there's been a timing discontinuity of more than 100ms.
1310     if ( in->start >= 0 &&
1311          ( pv->pts_next < 0 || ( in->start - pv->pts_next ) > 90*100 ) )
1312     {
1313         pv->pts_next = in->start;
1314     }
1315     prepare_ffmpeg_buffer( in );
1316     decodeAudio( w->audio, pv, in->data, in->size );
1317     *buf_out = link_buf_list( pv );
1318
1319     return HB_WORK_OK;
1320 }
1321
1322 hb_work_object_t hb_decavcodecvi =
1323 {
1324     WORK_DECAVCODECVI,
1325     "Video decoder (ffmpeg streams)",
1326     decavcodecviInit,
1327     decavcodecviWork,
1328     decavcodecClose,
1329     decavcodecviInfo,
1330     decavcodecvBSInfo
1331 };
1332
1333 hb_work_object_t hb_decavcodecai =
1334 {
1335     WORK_DECAVCODECAI,
1336     "Audio decoder (ffmpeg streams)",
1337     decavcodecviInit,
1338     decavcodecaiWork,
1339     decavcodecClose,
1340     decavcodecInfo,
1341     decavcodecBSInfo
1342 };