1 /* $Id: decavcodec.c,v 1.6 2005/03/06 04:08:54 titer Exp $
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. */
7 /* This module is Handbrake's interface to the ffmpeg decoder library
8 (libavcodec & small parts of libavformat). It contains four Handbrake
11 decavcodec connects HB to an ffmpeg audio decoder
12 decavcodecv connects HB to an ffmpeg video decoder
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.).
21 decavcodecai "internal" (incestuous?) version of decavcodec
22 decavcodecvi "internal" (incestuous?) version of decavcodecv
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
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.
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.
65 #include "libavcodec/audioconvert.h"
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 * );
73 hb_work_object_t hb_decavcodec =
76 "MPGA decoder (libavcodec)",
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];
93 struct hb_work_private_s
96 AVCodecContext *context;
97 AVCodecParserContext *parser;
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
106 uint32_t decode_errors;
107 int brokenByMicrosoft; // video stream may contain packed b-frames
108 hb_buffer_t* delayq[HEAP_SIZE];
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;
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 );
120 static int64_t heap_pop( pts_heap_t *heap )
124 if ( heap->nheap <= 0 )
129 // return the top of the heap then put the bottom element on top,
130 // decrease the heap size by one & rebalence the heap.
133 int64_t v = heap->h[heap->nheap--];
135 int child = parent << 1;
136 while ( child <= heap->nheap )
138 // find the smallest of the two children of parent
139 if (child < heap->nheap && heap->h[child] > heap->h[child+1] )
142 if (v <= heap->h[child])
143 // new item is smaller than either child so it's the new parent.
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;
157 static void heap_push( pts_heap_t *heap, int64_t v )
159 if ( heap->nheap < HEAP_SIZE )
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;
168 int parent = child >> 1;
169 if (heap->h[parent] <= v)
172 int64_t hp = heap->h[parent];
180 /***********************************************************************
181 * hb_work_decavcodec_init
182 ***********************************************************************
184 **********************************************************************/
185 static int decavcodecInit( hb_work_object_t * w, hb_job_t * job )
189 hb_work_private_t * pv = calloc( 1, sizeof( hb_work_private_t ) );
190 w->private_data = pv;
193 pv->list = hb_list_init();
195 int codec_id = w->codec_param;
198 codec_id = CODEC_ID_MP2;
200 codec = avcodec_find_decoder( codec_id );
201 pv->parser = av_parser_init( codec_id );
203 pv->context = avcodec_alloc_context();
204 hb_avcodec_open( pv->context, codec );
206 if ( w->audio != NULL &&
207 hb_need_downmix( w->audio->config.in.channel_layout,
208 w->audio->config.out.mixdown) )
210 pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout,
211 w->audio->config.out.mixdown);
217 /***********************************************************************
219 ***********************************************************************
221 **********************************************************************/
222 static void decavcodecClose( hb_work_object_t * w )
224 hb_work_private_t * pv = w->private_data;
228 if ( pv->job && pv->context && pv->context->codec )
230 hb_log( "%s-decoder done: %u frames, %u decoder errors, %u drops",
231 pv->context->codec->name, pv->nframes, pv->decode_errors,
234 if ( pv->sws_context )
236 sws_freeContext( pv->sws_context );
240 av_parser_close(pv->parser);
242 if ( pv->context && pv->context->codec )
244 hb_avcodec_close( pv->context );
248 hb_list_close( &pv->list );
252 av_free( pv->buffer );
257 hb_downmix_close( &(pv->downmix) );
259 if ( pv->downmix_buffer )
261 free( pv->downmix_buffer );
262 pv->downmix_buffer = NULL;
265 w->private_data = NULL;
269 /***********************************************************************
271 ***********************************************************************
273 **********************************************************************/
274 static int decavcodecWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
275 hb_buffer_t ** buf_out )
277 hb_work_private_t * pv = w->private_data;
278 hb_buffer_t * in = *buf_in;
282 /* EOF on input stream - send it downstream & say that we're done */
290 if ( in->start < -1 && pv->pts_next <= 0 )
292 // discard buffers that start before video time 0
296 // if the packet has a timestamp use it
297 if ( in->start != -1 )
299 pv->pts_next = in->start;
303 for ( pos = 0; pos < in->size; pos += len )
305 uint8_t *parser_output_buffer;
306 int parser_output_buffer_len;
307 int64_t cur = pv->pts_next;
309 if ( pv->parser != NULL )
311 len = av_parser_parse2( pv->parser, pv->context,
312 &parser_output_buffer, &parser_output_buffer_len,
313 in->data + pos, in->size - pos, cur, cur, AV_NOPTS_VALUE );
317 parser_output_buffer = in->data;
318 len = parser_output_buffer_len = in->size;
320 if (parser_output_buffer_len)
322 // set the duration on every frame since the stream format can
323 // change (it shouldn't but there's no way to guarantee it).
324 // duration is a scaling factor to go from #bytes in the decoded
325 // frame to frame time (in 90KHz mpeg ticks). 'channels' converts
326 // total samples to per-channel samples. 'sample_rate' converts
327 // per-channel samples to seconds per sample and the 90000
328 // is mpeg ticks per second.
329 if ( pv->context->sample_rate && pv->context->channels )
331 pv->duration = 90000. /
332 (double)( pv->context->sample_rate * pv->context->channels );
334 decodeAudio( w->audio, pv, parser_output_buffer, parser_output_buffer_len );
337 *buf_out = link_buf_list( pv );
341 static int decavcodecInfo( hb_work_object_t *w, hb_work_info_t *info )
343 hb_work_private_t *pv = w->private_data;
345 memset( info, 0, sizeof(*info) );
347 if ( pv && pv->context )
349 AVCodecContext *context = pv->context;
350 info->bitrate = context->bit_rate;
351 info->rate = context->time_base.num;
352 info->rate_base = context->time_base.den;
353 info->profile = context->profile;
354 info->level = context->level;
360 static int decavcodecBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
361 hb_work_info_t *info )
363 hb_work_private_t *pv = w->private_data;
366 memset( info, 0, sizeof(*info) );
368 if ( pv && pv->context )
370 return decavcodecInfo( w, info );
373 // We should parse the bitstream to find its parameters but for right
374 // now we just return dummy values if there's a codec that will handle it.
375 AVCodec *codec = avcodec_find_decoder( w->codec_param? w->codec_param :
379 // there's no ffmpeg codec for this audio type - give up
383 static char codec_name[64];
384 info->name = strncpy( codec_name, codec->name, sizeof(codec_name)-1 );
386 AVCodecParserContext *parser = av_parser_init( codec->id );
387 AVCodecContext *context = avcodec_alloc_context();
388 hb_avcodec_open( context, codec );
389 uint8_t *buffer = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
390 int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
391 unsigned char *pbuffer;
392 int pos, pbuffer_size;
394 while ( buf && !ret )
397 while ( pos < buf->size )
403 len = av_parser_parse2( parser, context, &pbuffer,
404 &pbuffer_size, buf->data + pos,
405 buf->size - pos, buf->start,
406 buf->start, AV_NOPTS_VALUE );
411 len = pbuffer_size = buf->size;
414 if ( pbuffer_size > 0 )
417 av_init_packet( &avp );
419 avp.size = pbuffer_size;
421 len = avcodec_decode_audio3( context, (int16_t*)buffer,
423 if ( len > 0 && context->sample_rate > 0 )
425 info->bitrate = context->bit_rate;
426 info->rate = context->sample_rate;
428 info->channel_layout =
429 hb_ff_layout_xlat(context->channel_layout,
440 if ( parser != NULL )
441 av_parser_close( parser );
442 hb_avcodec_close( context );
446 /* -------------------------------------------------------------
447 * General purpose video decoder using libavcodec
450 static uint8_t *copy_plane( uint8_t *dst, uint8_t* src, int dstride, int sstride,
453 if ( dstride == sstride )
455 memcpy( dst, src, dstride * h );
456 return dst + dstride * h;
458 int lbytes = dstride <= sstride? dstride : sstride;
461 memcpy( dst, src, lbytes );
468 // copy one video frame into an HB buf. If the frame isn't in our color space
469 // or at least one of its dimensions is odd, use sws_scale to convert/rescale it.
470 // Otherwise just copy the bits.
471 static hb_buffer_t *copy_frame( hb_work_private_t *pv, AVFrame *frame )
473 AVCodecContext *context = pv->context;
477 // if the dimensions are odd, drop the lsb since h264 requires that
478 // both width and height be even.
479 w = ( context->width >> 1 ) << 1;
480 h = ( context->height >> 1 ) << 1;
484 w = pv->job->title->width;
485 h = pv->job->title->height;
487 hb_buffer_t *buf = hb_video_buffer_init( w, h );
488 uint8_t *dst = buf->data;
490 if ( context->pix_fmt != PIX_FMT_YUV420P || w != context->width ||
491 h != context->height )
493 // have to convert to our internal color space and/or rescale
495 avpicture_fill( &dstpic, dst, PIX_FMT_YUV420P, w, h );
497 if ( ! pv->sws_context )
499 pv->sws_context = sws_getContext( context->width, context->height, context->pix_fmt,
500 w, h, PIX_FMT_YUV420P,
501 SWS_LANCZOS|SWS_ACCURATE_RND,
504 sws_scale( pv->sws_context, frame->data, frame->linesize, 0, h,
505 dstpic.data, dstpic.linesize );
509 dst = copy_plane( dst, frame->data[0], w, frame->linesize[0], h );
510 w = (w + 1) >> 1; h = (h + 1) >> 1;
511 dst = copy_plane( dst, frame->data[1], w, frame->linesize[1], h );
512 dst = copy_plane( dst, frame->data[2], w, frame->linesize[2], h );
517 static int get_frame_buf( AVCodecContext *context, AVFrame *frame )
519 hb_work_private_t *pv = context->opaque;
520 frame->pts = pv->pts;
522 return avcodec_default_get_buffer( context, frame );
525 static void log_chapter( hb_work_private_t *pv, int chap_num, int64_t pts )
527 hb_chapter_t *c = hb_list_item( pv->job->title->list_chapter, chap_num - 1 );
530 hb_log( "%s: \"%s\" (%d) at frame %u time %"PRId64,
531 pv->context->codec->name, c->title, chap_num, pv->nframes, pts );
535 hb_log( "%s: Chapter %d at frame %u time %"PRId64,
536 pv->context->codec->name, chap_num, pv->nframes, pts );
540 static void flushDelayQueue( hb_work_private_t *pv )
543 int slot = pv->nframes & (HEAP_SIZE-1);
545 // flush all the video packets left on our timestamp-reordering delay q
546 while ( ( buf = pv->delayq[slot] ) != NULL )
548 buf->start = heap_pop( &pv->pts_heap );
549 hb_list_add( pv->list, buf );
550 pv->delayq[slot] = NULL;
551 slot = ( slot + 1 ) & (HEAP_SIZE-1);
555 static int decodeFrame( hb_work_private_t *pv, uint8_t *data, int size )
557 int got_picture, oldlevel = 0;
561 if ( global_verbosity_level <= 1 )
563 oldlevel = av_log_get_level();
564 av_log_set_level( AV_LOG_QUIET );
567 av_init_packet( &avp );
570 if ( avcodec_decode_video2( pv->context, &frame, &got_picture, &avp ) < 0 )
574 if ( global_verbosity_level <= 1 )
576 av_log_set_level( oldlevel );
580 // ffmpeg makes it hard to attach a pts to a frame. if the MPEG ES
581 // packet had a pts we handed it to av_parser_parse (if the packet had
582 // no pts we set it to -1 but before the parse we can't distinguish between
583 // the start of a video frame with no pts & an intermediate packet of
584 // some frame which never has a pts). we hope that when parse returns
585 // the frame to us the pts we originally handed it will be in parser->pts.
586 // we put this pts into pv->pts so that when a avcodec_decode_video
587 // finally gets around to allocating an AVFrame to hold the decoded
588 // frame we can stuff that pts into the frame. if all of these relays
589 // worked at this point frame.pts should hold the frame's pts from the
590 // original data stream or -1 if it didn't have one. in the latter case
591 // we generate the next pts in sequence for it.
592 double frame_dur = pv->duration;
593 if ( frame_dur <= 0 )
595 frame_dur = 90000. * (double)pv->context->time_base.num /
596 (double)pv->context->time_base.den;
597 pv->duration = frame_dur;
599 if ( frame.repeat_pict )
601 frame_dur += frame.repeat_pict * frame_dur * 0.5;
603 // XXX Unlike every other video decoder, the Raw decoder doesn't
604 // use the standard buffer allocation routines so we never
605 // get to put a PTS in the frame. Do it now.
606 if ( pv->context->codec_id == CODEC_ID_RAWVIDEO )
611 // If there was no pts for this frame, assume constant frame rate
612 // video & estimate the next frame time from the last & duration.
613 double pts = frame.pts;
618 pv->pts_next = pts + frame_dur;
622 // if we're doing a scan or this content couldn't have been broken
623 // by Microsoft we don't worry about timestamp reordering
624 if ( ! pv->job || ! pv->brokenByMicrosoft )
626 buf = copy_frame( pv, &frame );
628 hb_list_add( pv->list, buf );
633 // XXX This following probably addresses a libavcodec bug but I don't
634 // see an easy fix so we workaround it here.
636 // The M$ 'packed B-frames' atrocity results in decoded frames with
637 // the wrong timestamp. E.g., if there are 2 b-frames the timestamps
638 // we see here will be "2 3 1 5 6 4 ..." instead of "1 2 3 4 5 6".
639 // The frames are actually delivered in the right order but with
640 // the wrong timestamp. To get the correct timestamp attached to
641 // each frame we have a delay queue (longer than the max number of
642 // b-frames) & a sorting heap for the timestamps. As each frame
643 // comes out of the decoder the oldest frame in the queue is removed
644 // and associated with the smallest timestamp. Then the new frame is
645 // added to the queue & its timestamp is pushed on the heap.
646 // This does nothing if the timestamps are correct (i.e., the video
647 // uses a codec that Micro$oft hasn't broken yet) but the frames
648 // get timestamped correctly even when M$ has munged them.
650 // remove the oldest picture from the frame queue (if any) &
651 // give it the smallest timestamp from our heap. The queue size
652 // is a power of two so we get the slot of the oldest by masking
653 // the frame count & this will become the slot of the newest
654 // once we've removed & processed the oldest.
655 int slot = pv->nframes & (HEAP_SIZE-1);
656 if ( ( buf = pv->delayq[slot] ) != NULL )
658 buf->start = heap_pop( &pv->pts_heap );
660 if ( pv->new_chap && buf->start >= pv->chap_time )
662 buf->new_chap = pv->new_chap;
665 log_chapter( pv, buf->new_chap, buf->start );
667 else if ( pv->nframes == 0 )
669 log_chapter( pv, pv->job->chapter_start, buf->start );
671 hb_list_add( pv->list, buf );
674 // add the new frame to the delayq & push its timestamp on the heap
675 pv->delayq[slot] = copy_frame( pv, &frame );
676 heap_push( &pv->pts_heap, pts );
684 static void decodeVideo( hb_work_private_t *pv, uint8_t *data, int size,
685 int64_t pts, int64_t dts )
688 * The following loop is a do..while because we need to handle both
689 * data & the flush at the end (signaled by size=0). At the end there's
690 * generally a frame in the parser & one or more frames in the decoder
691 * (depending on the bframes setting).
697 int len = av_parser_parse2( pv->parser, pv->context, &pout, &pout_len,
698 data + pos, size - pos, pts, dts, AV_NOPTS_VALUE );
703 pv->pts = pv->parser->pts;
704 decodeFrame( pv, pout, pout_len );
706 } while ( pos < size );
708 /* the stuff above flushed the parser, now flush the decoder */
711 while ( decodeFrame( pv, NULL, 0 ) )
714 flushDelayQueue( pv );
718 static hb_buffer_t *link_buf_list( hb_work_private_t *pv )
720 hb_buffer_t *head = hb_list_item( pv->list, 0 );
724 hb_list_rem( pv->list, head );
726 hb_buffer_t *last = head, *buf;
728 while ( ( buf = hb_list_item( pv->list, 0 ) ) != NULL )
730 hb_list_rem( pv->list, buf );
739 static int decavcodecvInit( hb_work_object_t * w, hb_job_t * job )
742 hb_work_private_t *pv = calloc( 1, sizeof( hb_work_private_t ) );
743 w->private_data = pv;
745 pv->list = hb_list_init();
747 int codec_id = w->codec_param;
748 pv->parser = av_parser_init( codec_id );
749 pv->context = avcodec_alloc_context2( CODEC_TYPE_VIDEO );
751 /* we have to wrap ffmpeg's get_buffer to be able to set the pts (?!) */
752 pv->context->opaque = pv;
753 pv->context->get_buffer = get_frame_buf;
758 static int next_hdr( hb_buffer_t *in, int offset )
760 uint8_t *dat = in->data;
761 uint16_t last2 = 0xffff;
762 for ( ; in->size - offset > 1; ++offset )
764 if ( last2 == 0 && dat[offset] == 0x01 )
765 // found an mpeg start code
768 last2 = ( last2 << 8 ) | dat[offset];
774 static int find_hdr( hb_buffer_t *in, int offset, uint8_t hdr_type )
776 if ( in->size - offset < 4 )
777 // not enough room for an mpeg start code
780 for ( ; ( offset = next_hdr( in, offset ) ) >= 0; ++offset )
782 if ( in->data[offset+3] == hdr_type )
789 static int setup_extradata( hb_work_object_t *w, hb_buffer_t *in )
791 hb_work_private_t *pv = w->private_data;
793 // we can't call the avstream funcs but the read_header func in the
794 // AVInputFormat may set up some state in the AVContext. In particular
795 // vc1t_read_header allocates 'extradata' to deal with header issues
796 // related to Microsoft's bizarre engineering notions. We alloc a chunk
797 // of space to make vc1 work then associate the codec with the context.
798 if ( w->codec_param != CODEC_ID_VC1 )
800 // we haven't been inflicted with M$ - allocate a little space as
801 // a marker and return success.
802 pv->context->extradata_size = 16;
803 pv->context->extradata = av_malloc(pv->context->extradata_size);
807 // find the start and and of the sequence header
809 if ( ( shdr = find_hdr( in, 0, 0x0f ) ) < 0 )
811 // didn't find start of seq hdr
814 if ( ( shdr_end = next_hdr( in, shdr + 4 ) ) < 0 )
820 // find the start and and of the entry point header
822 if ( ( ehdr = find_hdr( in, 0, 0x0e ) ) < 0 )
824 // didn't find start of entry point hdr
827 if ( ( ehdr_end = next_hdr( in, ehdr + 4 ) ) < 0 )
833 // found both headers - allocate an extradata big enough to hold both
834 // then copy them into it.
835 pv->context->extradata_size = shdr_end + ehdr_end;
836 pv->context->extradata = av_malloc(pv->context->extradata_size + 8);
837 memcpy( pv->context->extradata, in->data + shdr, shdr_end );
838 memcpy( pv->context->extradata + shdr_end, in->data + ehdr, ehdr_end );
839 memset( pv->context->extradata + shdr_end + ehdr_end, 0, 8);
843 static int decavcodecvWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
844 hb_buffer_t ** buf_out )
846 hb_work_private_t *pv = w->private_data;
847 hb_buffer_t *in = *buf_in;
848 int64_t pts = AV_NOPTS_VALUE;
853 /* if we got an empty buffer signaling end-of-stream send it downstream */
856 decodeVideo( pv, in->data, in->size, pts, dts );
857 hb_list_add( pv->list, in );
858 *buf_out = link_buf_list( pv );
862 // if this is the first frame open the codec (we have to wait for the
863 // first frame because of M$ VC1 braindamage).
864 if ( pv->context->extradata_size == 0 )
866 if ( setup_extradata( w, in ) )
868 // we didn't find the headers needed to set up extradata.
869 // the codec will abort if we open it so just free the buf
870 // and hope we eventually get the info we need.
871 hb_buffer_close( &in );
874 AVCodec *codec = avcodec_find_decoder( w->codec_param );
875 // There's a mis-feature in ffmpeg that causes the context to be
876 // incorrectly initialized the 1st time avcodec_open is called.
877 // If you close it and open a 2nd time, it finishes the job.
878 hb_avcodec_open( pv->context, codec );
879 hb_avcodec_close( pv->context );
880 hb_avcodec_open( pv->context, codec );
886 dts = in->renderOffset;
890 pv->new_chap = in->new_chap;
891 pv->chap_time = pts >= 0? pts : pv->pts_next;
893 decodeVideo( pv, in->data, in->size, pts, dts );
894 hb_buffer_close( &in );
895 *buf_out = link_buf_list( pv );
899 static int decavcodecvInfo( hb_work_object_t *w, hb_work_info_t *info )
901 hb_work_private_t *pv = w->private_data;
903 memset( info, 0, sizeof(*info) );
905 if ( pv && pv->context )
907 AVCodecContext *context = pv->context;
908 info->bitrate = context->bit_rate;
909 info->width = context->width;
910 info->height = context->height;
912 /* ffmpeg gives the frame rate in frames per second while HB wants
913 * it in units of the 27MHz MPEG clock. */
914 info->rate = 27000000;
915 info->rate_base = (int64_t)context->time_base.num * 27000000LL /
916 context->time_base.den;
917 if ( context->ticks_per_frame > 1 )
919 // for ffmpeg 0.5 & later, the H.264 & MPEG-2 time base is
920 // field rate rather than frame rate so convert back to frames.
921 info->rate_base *= context->ticks_per_frame;
924 info->pixel_aspect_width = context->sample_aspect_ratio.num;
925 info->pixel_aspect_height = context->sample_aspect_ratio.den;
927 /* Sometimes there's no pixel aspect set in the source ffmpeg context
928 * which appears to come from the video stream. In that case,
929 * try the pixel aspect in AVStream (which appears to come from
930 * the container). Else assume a 1:1 PAR. */
931 if ( info->pixel_aspect_width == 0 ||
932 info->pixel_aspect_height == 0 )
934 AVStream *st = hb_ffmpeg_avstream( w->codec_param );
935 info->pixel_aspect_width = st->sample_aspect_ratio.num ?
936 st->sample_aspect_ratio.num : 1;
937 info->pixel_aspect_height = st->sample_aspect_ratio.den ?
938 st->sample_aspect_ratio.den : 1;
940 /* ffmpeg returns the Pixel Aspect Ratio (PAR). Handbrake wants the
941 * Display Aspect Ratio so we convert by scaling by the Storage
942 * Aspect Ratio (w/h). We do the calc in floating point to get the
944 info->aspect = (double)info->pixel_aspect_width *
945 (double)context->width /
946 (double)info->pixel_aspect_height /
947 (double)context->height;
949 info->profile = context->profile;
950 info->level = context->level;
951 info->name = context->codec->name;
957 static int decavcodecvBSInfo( hb_work_object_t *w, const hb_buffer_t *buf,
958 hb_work_info_t *info )
963 hb_work_object_t hb_decavcodecv =
966 "Video decoder (libavcodec)",
975 // This is a special decoder for ffmpeg streams. The ffmpeg stream reader
976 // includes a parser and passes information from the parser to the decoder
977 // via a codec context kept in the AVStream of the reader's AVFormatContext.
978 // We *have* to use that codec context to decode the stream or we'll get
979 // garbage. ffmpeg_title_scan put a cookie that can be used to get to that
980 // codec context in our codec_param.
982 // this routine gets the appropriate context pointer from the ffmpeg
983 // stream reader. it can't be called until we get the first buffer because
984 // we can't guarantee that reader will be called before the our init
985 // routine and if our init is called first we'll get a pointer to the
986 // old scan stream (which has already been closed).
987 static void init_ffmpeg_context( hb_work_object_t *w )
989 hb_work_private_t *pv = w->private_data;
990 pv->context = hb_ffmpeg_context( w->codec_param );
992 // during scan the decoder gets closed & reopened which will
993 // close the codec so reopen it if it's not there
994 if ( ! pv->context->codec )
996 AVCodec *codec = avcodec_find_decoder( pv->context->codec_id );
997 hb_avcodec_open( pv->context, codec );
999 // set up our best guess at the frame duration.
1000 // the frame rate in the codec is usually bogus but it's sometimes
1001 // ok in the stream.
1002 AVStream *st = hb_ffmpeg_avstream( w->codec_param );
1004 if ( st->nb_frames && st->duration )
1006 // compute the average frame duration from the total number
1007 // of frames & the total duration.
1008 pv->duration = ( (double)st->duration * (double)st->time_base.num ) /
1009 ( (double)st->nb_frames * (double)st->time_base.den );
1013 // XXX We don't have a frame count or duration so try to use the
1014 // far less reliable time base info in the stream.
1015 // Because the time bases are so screwed up, we only take values
1016 // in the range 8fps - 64fps.
1018 if ( st->time_base.num * 64 > st->time_base.den &&
1019 st->time_base.den > st->time_base.num * 8 )
1023 else if ( st->r_frame_rate.den * 64 > st->r_frame_rate.num &&
1024 st->r_frame_rate.num > st->r_frame_rate.den * 8 )
1026 tb.num = st->r_frame_rate.den;
1027 tb.den = st->r_frame_rate.num;
1031 tb.num = 1001; /*XXX*/
1032 tb.den = 24000; /*XXX*/
1034 pv->duration = (double)tb.num / (double)tb.den;
1036 pv->duration *= 90000.;
1038 // we have to wrap ffmpeg's get_buffer to be able to set the pts (?!)
1039 pv->context->opaque = pv;
1040 pv->context->get_buffer = get_frame_buf;
1042 // avi, mkv and possibly mp4 containers can contain the M$ VFW packed
1043 // b-frames abortion that messes up frame ordering and timestamps.
1044 // XXX ffmpeg knows which streams are broken but doesn't expose the
1045 // info externally. We should patch ffmpeg to add a flag to the
1046 // codec context for this but until then we mark all ffmpeg streams
1048 pv->brokenByMicrosoft = 1;
1051 static void prepare_ffmpeg_buffer( hb_buffer_t * in )
1053 // ffmpeg requires an extra 8 bytes of zero at the end of the buffer and
1054 // will seg fault in odd, data dependent ways if it's not there. (my guess
1055 // is this is a case of a local performance optimization creating a global
1056 // performance degradation since all the time wasted by extraneous data
1057 // copies & memory zeroing has to be huge compared to the minor reduction
1058 // in inner-loop instructions this affords - modern cpus bottleneck on
1059 // memory bandwidth not instruction bandwidth).
1060 if ( in->size + FF_INPUT_BUFFER_PADDING_SIZE > in->alloc )
1062 // have to realloc to add the padding
1063 hb_buffer_realloc( in, in->size + FF_INPUT_BUFFER_PADDING_SIZE );
1065 memset( in->data + in->size, 0, FF_INPUT_BUFFER_PADDING_SIZE );
1068 static int decavcodecviInit( hb_work_object_t * w, hb_job_t * job )
1071 hb_work_private_t *pv = calloc( 1, sizeof( hb_work_private_t ) );
1072 w->private_data = pv;
1074 pv->list = hb_list_init();
1078 if ( w->audio != NULL &&
1079 hb_need_downmix( w->audio->config.in.channel_layout,
1080 w->audio->config.out.mixdown) )
1082 pv->downmix = hb_downmix_init(w->audio->config.in.channel_layout,
1083 w->audio->config.out.mixdown);
1089 static int decavcodecviWork( hb_work_object_t * w, hb_buffer_t ** buf_in,
1090 hb_buffer_t ** buf_out )
1092 hb_work_private_t *pv = w->private_data;
1093 hb_buffer_t *in = *buf_in;
1096 /* if we got an empty buffer signaling end-of-stream send it downstream */
1097 if ( in->size == 0 )
1099 /* flush any frames left in the decoder */
1100 while ( pv->context && decodeFrame( pv, NULL, 0 ) )
1103 flushDelayQueue( pv );
1104 hb_list_add( pv->list, in );
1105 *buf_out = link_buf_list( pv );
1106 return HB_WORK_DONE;
1109 if ( ! pv->context )
1111 init_ffmpeg_context( w );
1114 int64_t pts = in->start;
1117 // use the first timestamp as our 'next expected' pts
1118 if ( pv->pts_next < 0 )
1127 pv->new_chap = in->new_chap;
1128 pv->chap_time = pts >= 0? pts : pv->pts_next;
1130 prepare_ffmpeg_buffer( in );
1131 decodeFrame( pv, in->data, in->size );
1132 hb_buffer_close( &in );
1133 *buf_out = link_buf_list( pv );
1137 static int decavcodecviInfo( hb_work_object_t *w, hb_work_info_t *info )
1139 if ( decavcodecvInfo( w, info ) )
1141 hb_work_private_t *pv = w->private_data;
1142 if ( ! pv->context )
1144 init_ffmpeg_context( w );
1146 // we have the frame duration in units of the 90KHz pts clock but
1147 // need it in units of the 27MHz MPEG clock. */
1148 info->rate = 27000000;
1149 info->rate_base = pv->duration * 300.;
1155 static void decodeAudio( hb_audio_t * audio, hb_work_private_t *pv, uint8_t *data, int size )
1157 AVCodecContext *context = pv->context;
1160 while ( pos < size )
1162 int16_t *buffer = pv->buffer;
1163 if ( buffer == NULL )
1165 pv->buffer = av_malloc( AVCODEC_MAX_AUDIO_FRAME_SIZE );
1166 buffer = pv->buffer;
1170 av_init_packet( &avp );
1171 avp.data = data + pos;
1172 avp.size = size - pos;
1174 int out_size = AVCODEC_MAX_AUDIO_FRAME_SIZE;
1176 int len = avcodec_decode_audio3( context, buffer, &out_size, &avp );
1184 // We require signed 16-bit ints for the output format. If
1185 // we got something different convert it.
1186 if ( context->sample_fmt != SAMPLE_FMT_S16 )
1188 // Note: av_audio_convert seems to be a work-in-progress but
1189 // looks like it will eventually handle general audio
1190 // mixdowns which would allow us much more flexibility
1191 // in handling multichannel audio in HB. If we were doing
1192 // anything more complicated than a one-for-one format
1193 // conversion we'd probably want to cache the converter
1194 // context in the pv.
1195 int isamp = av_get_bits_per_sample_format( context->sample_fmt ) / 8;
1196 AVAudioConvert *ctx = av_audio_convert_alloc( SAMPLE_FMT_S16, 1,
1197 context->sample_fmt, 1,
1199 // get output buffer size (in 2-byte samples) then malloc a buffer
1200 nsamples = out_size / isamp;
1201 buffer = av_malloc( nsamples * 2 );
1203 // we're doing straight sample format conversion which behaves as if
1204 // there were only one channel.
1205 const void * const ibuf[6] = { pv->buffer };
1206 void * const obuf[6] = { buffer };
1207 const int istride[6] = { isamp };
1208 const int ostride[6] = { 2 };
1210 av_audio_convert( ctx, obuf, ostride, ibuf, istride, nsamples );
1211 av_audio_convert_free( ctx );
1215 nsamples = out_size / 2;
1222 pv->downmix_buffer = realloc(pv->downmix_buffer, nsamples * sizeof(hb_sample_t));
1225 for( i = 0; i < nsamples; ++i )
1227 pv->downmix_buffer[i] = buffer[i];
1230 int n_ch_samples = nsamples / context->channels;
1231 hb_layout_remap( hb_smpte_chan_map, pv->downmix_buffer,
1232 audio->config.in.channel_layout, n_ch_samples );
1234 int channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown);
1236 buf = hb_buffer_init( n_ch_samples * channels * sizeof(float) );
1237 hb_sample_t *samples = (hb_sample_t *)buf->data;
1238 hb_downmix(pv->downmix, samples, pv->downmix_buffer, n_ch_samples);
1242 buf = hb_buffer_init( nsamples * sizeof(float) );
1243 float *fl32 = (float *)buf->data;
1245 for( i = 0; i < nsamples; ++i )
1247 fl32[i] = buffer[i];
1249 int n_ch_samples = nsamples / context->channels;
1250 hb_layout_remap( hb_smpte_chan_map, fl32,
1251 audio->config.in.channel_layout, n_ch_samples );
1254 double pts = pv->pts_next;
1256 pts += nsamples * pv->duration;
1260 hb_list_add( pv->list, buf );
1262 // if we allocated a buffer for sample format conversion, free it
1263 if ( buffer != pv->buffer )
1271 static int decavcodecaiWork( hb_work_object_t *w, hb_buffer_t **buf_in,
1272 hb_buffer_t **buf_out )
1274 if ( (*buf_in)->size <= 0 )
1276 /* EOF on input stream - send it downstream & say that we're done */
1279 return HB_WORK_DONE;
1282 hb_work_private_t *pv = w->private_data;
1284 if ( (*buf_in)->start < -1 && pv->pts_next <= 0 )
1286 // discard buffers that start before video time 0
1291 if ( ! pv->context )
1293 init_ffmpeg_context( w );
1294 // duration is a scaling factor to go from #bytes in the decoded
1295 // frame to frame time (in 90KHz mpeg ticks). 'channels' converts
1296 // total samples to per-channel samples. 'sample_rate' converts
1297 // per-channel samples to seconds per sample and the 90000
1298 // is mpeg ticks per second.
1299 pv->duration = 90000. /
1300 (double)( pv->context->sample_rate * pv->context->channels );
1302 hb_buffer_t *in = *buf_in;
1304 // if the packet has a timestamp use it if we don't have a timestamp yet
1305 // or if there's been a timing discontinuity of more than 100ms.
1306 if ( in->start >= 0 &&
1307 ( pv->pts_next < 0 || ( in->start - pv->pts_next ) > 90*100 ) )
1309 pv->pts_next = in->start;
1311 prepare_ffmpeg_buffer( in );
1312 decodeAudio( w->audio, pv, in->data, in->size );
1313 *buf_out = link_buf_list( pv );
1318 hb_work_object_t hb_decavcodecvi =
1321 "Video decoder (ffmpeg streams)",
1329 hb_work_object_t hb_decavcodecai =
1332 "Audio decoder (ffmpeg streams)",