diff options
author | prigaux <[email protected]> | 2007-02-11 20:00:15 +0000 |
---|---|---|
committer | prigaux <[email protected]> | 2007-02-11 20:00:15 +0000 |
commit | a74fd5a1ec37e53fe7008f022639af6ede0e82c9 (patch) | |
tree | 0a6a32640a840b72653149aa11efa264674df976 /libhb/decmpeg2.c | |
parent | f45dfeb2afb1b0bf46054959e8ea9494f3b7d14f (diff) |
Merge the 0.8.0_mpeg4ip branch into the trunk
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@285 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/decmpeg2.c')
-rw-r--r-- | libhb/decmpeg2.c | 253 |
1 files changed, 0 insertions, 253 deletions
diff --git a/libhb/decmpeg2.c b/libhb/decmpeg2.c deleted file mode 100644 index 214444a05..000000000 --- a/libhb/decmpeg2.c +++ /dev/null @@ -1,253 +0,0 @@ -/* $Id: decmpeg2.c,v 1.12 2005/03/03 16:30:42 titer Exp $ - - This file is part of the HandBrake source code. - Homepage: <http://handbrake.m0k.org/>. - It may be used under the terms of the GNU General Public License. */ - -#include "hb.h" - -#include "mpeg2dec/mpeg2.h" - -/********************************************************************** - * hb_libmpeg2_t - ********************************************************************** - * A convenient libmpeg wrapper, used both here and in scan.c - *********************************************************************/ -struct hb_libmpeg2_s -{ - mpeg2dec_t * libmpeg2; - const mpeg2_info_t * info; - int width; - int height; - int rate; - int got_iframe; - int64_t last_pts; -}; - -/********************************************************************** - * hb_libmpeg2_init - ********************************************************************** - * - *********************************************************************/ -hb_libmpeg2_t * hb_libmpeg2_init() -{ - hb_libmpeg2_t * m = calloc( sizeof( hb_libmpeg2_t ), 1 ); - - m->libmpeg2 = mpeg2_init(); - m->info = mpeg2_info( m->libmpeg2 ); - m->last_pts = -1; - - return m; -} - -/********************************************************************** - * hb_libmpeg2_decode - ********************************************************************** - * - *********************************************************************/ -int hb_libmpeg2_decode( hb_libmpeg2_t * m, hb_buffer_t * buf_es, - hb_list_t * list_raw ) -{ - mpeg2_state_t state; - hb_buffer_t * buf; - uint8_t * data; - - /* Feed libmpeg2 */ - if( buf_es->start > -1 ) - { - mpeg2_tag_picture( m->libmpeg2, buf_es->start >> 32, - buf_es->start & 0xFFFFFFFF ); - } - mpeg2_buffer( m->libmpeg2, buf_es->data, - buf_es->data + buf_es->size ); - - for( ;; ) - { - state = mpeg2_parse( m->libmpeg2 ); - if( state == STATE_BUFFER ) - { - /* Require some more data */ - break; - } - else if( state == STATE_SEQUENCE ) - { - if( !( m->width && m->height && m->rate ) ) - { - m->width = m->info->sequence->width; - m->height = m->info->sequence->height; - m->rate = m->info->sequence->frame_period; - - if( m->rate == 900900 ) - { - /* 29.97 fps. 3:2 pulldown might, or might not be - used. I can't find a way to know, so we always - output 23.976 */ - m->rate = 1126125; - } - } - } - else if( ( state == STATE_SLICE || state == STATE_END ) && - m->info->display_fbuf ) - { - if( ( m->info->display_picture->flags & - PIC_MASK_CODING_TYPE ) == PIC_FLAG_CODING_TYPE_I ) - { - m->got_iframe = 1; - } - - if( m->got_iframe ) - { - buf = hb_buffer_init( m->width * m->height * 3 / 2 ); - data = buf->data; - - memcpy( data, m->info->display_fbuf->buf[0], - m->width * m->height ); - data += m->width * m->height; - memcpy( data, m->info->display_fbuf->buf[1], - m->width * m->height / 4 ); - data += m->width * m->height / 4; - memcpy( data, m->info->display_fbuf->buf[2], - m->width * m->height / 4 ); - - if( m->info->display_picture->flags & PIC_FLAG_TAGS ) - { - buf->start = - ( (uint64_t) m->info->display_picture->tag << 32 ) | - ( (uint64_t) m->info->display_picture->tag2 ); - } - else if( m->last_pts > -1 ) - { - /* For some reason nb_fields is sometimes 1 while it - should be 2 */ - buf->start = m->last_pts + - MAX( 2, m->info->display_picture->nb_fields ) * - m->info->sequence->frame_period / 600; - } - else - { - buf->start = -1; - } - m->last_pts = buf->start; - - hb_list_add( list_raw, buf ); - } - } - else if( state == STATE_INVALID ) - { - mpeg2_reset( m->libmpeg2, 0 ); - } - } - return 1; -} - -/********************************************************************** - * hb_libmpeg2_info - ********************************************************************** - * - *********************************************************************/ -void hb_libmpeg2_info( hb_libmpeg2_t * m, int * width, int * height, - int * rate ) -{ - *width = m->width; - *height = m->height; - *rate = m->rate; -} - -/********************************************************************** - * hb_libmpeg2_close - ********************************************************************** - * - *********************************************************************/ -void hb_libmpeg2_close( hb_libmpeg2_t ** _m ) -{ - hb_libmpeg2_t * m = *_m; - - mpeg2_close( m->libmpeg2 ); - - free( m ); - *_m = NULL; -} - -/********************************************************************** - * The decmpeg2 work object - ********************************************************************** - * - *********************************************************************/ -struct hb_work_private_s -{ - hb_libmpeg2_t * libmpeg2; - hb_list_t * list; -}; - -/********************************************************************** - * hb_work_decmpeg2_init - ********************************************************************** - * - *********************************************************************/ -int decmpeg2Init( hb_work_object_t * w, hb_job_t * job ) -{ - hb_work_private_t * pv; - - pv = calloc( 1, sizeof( hb_work_private_t ) ); - w->private_data = pv; - - pv->libmpeg2 = hb_libmpeg2_init(); - pv->list = hb_list_init(); - - return 0; -} - -/********************************************************************** - * Work - ********************************************************************** - * - *********************************************************************/ -int decmpeg2Work( hb_work_object_t * w, hb_buffer_t ** buf_in, - hb_buffer_t ** buf_out ) -{ - hb_work_private_t * pv = w->private_data; - hb_buffer_t * buf, * last = NULL; - - hb_libmpeg2_decode( pv->libmpeg2, *buf_in, pv->list ); - - *buf_out = NULL; - while( ( buf = hb_list_item( pv->list, 0 ) ) ) - { - hb_list_rem( pv->list, buf ); - if( last ) - { - last->next = buf; - last = buf; - } - else - { - *buf_out = buf; - last = buf; - } - } - - return HB_WORK_OK; -} - -/********************************************************************** - * Close - ********************************************************************** - * - *********************************************************************/ -void decmpeg2Close( hb_work_object_t * w ) -{ - hb_work_private_t * pv = w->private_data; - hb_list_close( &pv->list ); - hb_libmpeg2_close( &pv->libmpeg2 ); - free( pv ); -} - -hb_work_object_t hb_decmpeg2 = -{ - WORK_DECMPEG2, - "MPEG-2 decoder (libmpeg2)", - decmpeg2Init, - decmpeg2Work, - decmpeg2Close -}; - |