diff options
Diffstat (limited to 'libhb')
-rw-r--r-- | libhb/bd.c | 3 | ||||
-rw-r--r-- | libhb/common.c | 3 | ||||
-rw-r--r-- | libhb/common.h | 1 | ||||
-rw-r--r-- | libhb/deblock.c | 1 | ||||
-rw-r--r-- | libhb/decmpeg2.c | 1013 | ||||
-rw-r--r-- | libhb/decomb.c | 1 | ||||
-rw-r--r-- | libhb/deinterlace.c | 1 | ||||
-rw-r--r-- | libhb/denoise.c | 1 | ||||
-rw-r--r-- | libhb/detelecine.c | 1 | ||||
-rw-r--r-- | libhb/hb.c | 1 | ||||
-rw-r--r-- | libhb/internal.h | 6 | ||||
-rw-r--r-- | libhb/module.defs | 3 | ||||
-rw-r--r-- | libhb/scan.c | 11 | ||||
-rw-r--r-- | libhb/stream.c | 8 | ||||
-rw-r--r-- | libhb/work.c | 12 |
15 files changed, 18 insertions, 1048 deletions
diff --git a/libhb/bd.c b/libhb/bd.c index 7d2bab390..356e14bee 100644 --- a/libhb/bd.c +++ b/libhb/bd.c @@ -340,7 +340,8 @@ hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration ) { case BLURAY_STREAM_TYPE_VIDEO_MPEG1: case BLURAY_STREAM_TYPE_VIDEO_MPEG2: - title->video_codec = WORK_DECMPEG2; + title->video_codec = WORK_DECAVCODECV; + title->video_codec_param = AV_CODEC_ID_MPEG2VIDEO; title->video_codec_param = 0; break; diff --git a/libhb/common.c b/libhb/common.c index 720770a5d..a0e6b7a58 100644 --- a/libhb/common.c +++ b/libhb/common.c @@ -2808,7 +2808,8 @@ hb_title_t * hb_title_init( char * path, int index ) strcat( t->path, path ); // default to decoding mpeg2 t->video_id = 0xE0; - t->video_codec = WORK_DECMPEG2; + t->video_codec = WORK_DECAVCODECV; + t->video_codec_param = AV_CODEC_ID_MPEG2VIDEO; t->angle_count = 1; t->pixel_aspect_width = 1; t->pixel_aspect_height = 1; diff --git a/libhb/common.h b/libhb/common.h index a76e51e55..613338b35 100644 --- a/libhb/common.h +++ b/libhb/common.h @@ -1061,7 +1061,6 @@ struct hb_work_object_s extern hb_work_object_t hb_sync_video; extern hb_work_object_t hb_sync_audio; -extern hb_work_object_t hb_decmpeg2; extern hb_work_object_t hb_decvobsub; extern hb_work_object_t hb_encvobsub; extern hb_work_object_t hb_deccc608; diff --git a/libhb/deblock.c b/libhb/deblock.c index dab622abc..1d50fc552 100644 --- a/libhb/deblock.c +++ b/libhb/deblock.c @@ -18,7 +18,6 @@ #include "hb.h" #include "hbffmpeg.h" -#include "mpeg2dec/mpeg2.h" #define PP7_QP_DEFAULT 5 #define PP7_MODE_DEFAULT 2 diff --git a/libhb/decmpeg2.c b/libhb/decmpeg2.c deleted file mode 100644 index 9d6b8fe42..000000000 --- a/libhb/decmpeg2.c +++ /dev/null @@ -1,1013 +0,0 @@ -/* decmpeg2.c - - Copyright (c) 2003-2013 HandBrake Team - This file is part of the HandBrake source code - Homepage: <http://handbrake.fr/>. - It may be used under the terms of the GNU General Public License v2. - For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html - */ - -#include "hb.h" -#include "hbffmpeg.h" -#include "mpeg2dec/mpeg2.h" - -/* Cadence tracking */ -#ifndef PIC_FLAG_REPEAT_FIRST_FIELD -#define PIC_FLAG_REPEAT_FIRST_FIELD 256 -#endif -#define TOP_FIRST PIC_FLAG_TOP_FIELD_FIRST -#define PROGRESSIVE PIC_FLAG_PROGRESSIVE_FRAME -#define COMPOSITE PIC_FLAG_COMPOSITE_DISPLAY -#define SKIP PIC_FLAG_SKIP -#define TAGS PIC_FLAG_TAGS -#define REPEAT_FIRST PIC_FLAG_REPEAT_FIRST_FIELD -#define COMPOSITE_MASK PIC_MASK_COMPOSITE_DISPLAY -#define TB 8 -#define BT 16 -#define BT_PROG 32 -#define BTB_PROG 64 -#define TB_PROG 128 -#define TBT_PROG 256 - -#define NTAGS 8 - -/********************************************************************** - * hb_libmpeg2_t - *********************************************************************/ -typedef struct hb_libmpeg2_s -{ - mpeg2dec_t * libmpeg2; - const mpeg2_info_t * info; - hb_job_t * job; - hb_title_t * title; - int width; - int height; - int rate; - double aspect_ratio; - enum AVPixelFormat pixfmt; - int got_iframe; /* set when we get our first iframe */ - int look_for_iframe; /* need an iframe to add chap break */ - int look_for_break; /* need gop start to add chap break */ - int cur_tag; /* index of current tag */ - uint32_t nframes; /* number of frames we've decoded */ - int64_t last_pts; - int64_t first_pts; - int cadence[12]; - int flag; - hb_list_t * list_subtitle; - hb_buffer_t * last_cc1_buf; - struct { - int64_t start; // start time of this frame - hb_buffer_t * cc_buf; // captions for this frame - } tags[NTAGS]; - uint8_t cc_tag_pending; - - struct SwsContext *sws_context; // if we have to rescale or convert color space - int sws_width; - int sws_height; - int sws_pix_fmt; -} hb_libmpeg2_t; - -/********************************************************************** - * hb_libmpeg2_init - ********************************************************************** - * - *********************************************************************/ -static 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; - m->first_pts = -1; - - int i; - for ( i = 0; i < NTAGS; ++i ) - { - m->tags[i].start = -2; - } - - return m; -} - -// send cc_buf to the CC decoder(s) -static void cc_send_to_decoder( hb_libmpeg2_t *m, hb_buffer_t *cc_buf ) -{ - hb_subtitle_t *subtitle; - - // if there's more than one decoder for the captions send a copy - // of the buffer to all but the last. Then send the buffer to - // the last one (usually there's just one decoder so the 'while' is skipped). - int i = 0, n = hb_list_count( m->list_subtitle ); - while ( --n > 0 ) - { - // make a copy of the buf then forward it to the decoder - hb_buffer_t *cpy = hb_buffer_init( cc_buf->size ); - cpy->s = cc_buf->s; - memcpy( cpy->data, cc_buf->data, cc_buf->size ); - - subtitle = hb_list_item( m->list_subtitle, i++ ); - hb_fifo_push( subtitle->fifo_in, cpy ); - } - subtitle = hb_list_item( m->list_subtitle, i ); - hb_fifo_push( subtitle->fifo_in, cc_buf ); -} - -static void hb_mpeg2_cc( hb_libmpeg2_t *m, const uint8_t *cc_block ) -{ - uint8_t cc_hdr = *cc_block; - - if ( ( cc_hdr & 0x4 ) == 0 ) - // not valid - ignore - return; - - switch (cc_hdr & 3) - { - case 0: - // CC1 stream - if ( ( cc_block[1] & 0x7f ) == 0 && ( cc_block[2] & 0x7f ) == 0 ) - // just padding - ignore - return; - - if ( m->last_cc1_buf ) - { - // new data from the same time as last call - add to buffer - int len = m->last_cc1_buf->size; - hb_buffer_realloc( m->last_cc1_buf, len + 2 ); - memcpy( m->last_cc1_buf->data + len, cc_block+1, 2 ); - m->last_cc1_buf->size = len + 2; - return; - } - - // allocate a new buffer and copy the caption data into it. - // (we don't send it yet because we don't know what timestamp to use). - hb_buffer_t *cc_buf = hb_buffer_init( 2 ); - if( !cc_buf ) - return; - - memcpy( cc_buf->data, cc_block+1, 2 ); - m->last_cc1_buf = cc_buf; - break; -#ifdef notyet - case 1: - // CC2 stream - //process608( cc_block+1, 2, &m->cc608 ); - break; - case 2: //EIA-708 - // DTVCC packet data - // Fall through - case 3: //EIA-708 - { - uint8_t temp[4]; - temp[0]=cc_valid; - temp[1]=cc_type; - temp[2]=cc_block[1]; - temp[3]=cc_block[2]; - do_708 ((const unsigned char *) temp, 4); - } - break; -#endif - default: - break; - } -} - -static inline int have_captions( const uint8_t *user_data, uint32_t len ) -{ - return len >= 6 && - ( ( user_data[0] == 0x43 && user_data[1] == 0x43 ) || - ( user_data[0] == 0x47 && user_data[1] == 0x41 && - user_data[2] == 0x39 && user_data[3] == 0x34 && - user_data[4] == 3 && (user_data[5] & 0x40) ) ); -} - -static void do_one_dvd_cc( hb_libmpeg2_t *m, const uint8_t *header, int field1 ) -{ - uint8_t data[3]; - - data[0] = ( header[0] == 0xff && 0 == field1 )? 0x04 : 0x05; - data[1] = header[1]; - data[2] = header[2]; - hb_mpeg2_cc( m, data ); - - data[0] = ( header[3] == 0xff && 1 == field1 )? 0x04 : 0x05; - data[1] = header[4]; - data[2] = header[5]; - hb_mpeg2_cc( m, data ); -} - -// extract all the captions in the current frame and send them downstream -// to the decoder. -// -// (this routine should only be called if there are captions in the current -// frame. I.e., only if a call to 'have_captions' returns true.) -static void extract_mpeg2_captions( hb_libmpeg2_t *m ) -{ - const uint8_t *user_data = m->info->user_data; - int dvd_captions = user_data[0] == 0x43; - int capcount, field1packet = 0; - const uint8_t *header = &user_data[4]; - if ( !dvd_captions ) - { - // ATSC encapsulated captions - header starts one byte later - // and has an extra unused byte following it. - capcount = header[1] & 0x1f; - header += 3; - } - else - { - // DVD captions - if ( ( header[0] & 0x80 ) == 0x00 ) - field1packet=1; /* expect Field 1 second */ - capcount=(header[0] & 0x1e) / 2; - header++; - } - - int i; - for( i=0; i<capcount; i++ ) - { - if ( !dvd_captions ) - { - hb_mpeg2_cc( m, header ); - header += 3; - } - else - { - do_one_dvd_cc( m, header, field1packet ); - header += 6; - } - } - if ( dvd_captions ) - { - // Deal with extra closed captions some DVDs have. - while( header[0]==0xfe || header[0]==0xff ) - { - do_one_dvd_cc( m, header, field1packet ); - header += 6; - } - } -} - -static void next_tag( hb_libmpeg2_t *m, hb_buffer_t *buf_es ) -{ - if( m->tags[m->cur_tag].cc_buf == m->last_cc1_buf ) - m->last_cc1_buf = NULL; - - m->cur_tag = ( m->cur_tag + 1 ) & (NTAGS-1); - if ( m->tags[m->cur_tag].start >= 0 || m->tags[m->cur_tag].cc_buf ) - { - if ( m->tags[m->cur_tag].start < 0 || - ( m->got_iframe && m->tags[m->cur_tag].start >= m->first_pts ) ) - hb_log("mpeg2 tag botch: pts %"PRId64", tag pts %"PRId64" buf %p", - buf_es->s.start, m->tags[m->cur_tag].start, m->tags[m->cur_tag].cc_buf); - if ( m->tags[m->cur_tag].cc_buf ) - hb_buffer_close( &m->tags[m->cur_tag].cc_buf ); - } - m->tags[m->cur_tag].start = buf_es->s.start; - mpeg2_tag_picture( m->libmpeg2, m->cur_tag, 0 ); -} - -static hb_buffer_t *hb_copy_frame( hb_libmpeg2_t *m ) -{ - hb_job_t * job = m->job; - int width = m->info->sequence->width; - int height = m->info->sequence->height; - enum AVPixelFormat pixfmt = m->pixfmt; - uint8_t *y = m->info->display_fbuf->buf[0]; - uint8_t *u = m->info->display_fbuf->buf[1]; - uint8_t *v = m->info->display_fbuf->buf[2]; - int crop[4] = {0}; - - int dst_w, dst_h; - int src_w, src_h; - - if ( m->info->sequence->picture_width < m->info->sequence->width ) - { - crop[3] = m->info->sequence->width - m->info->sequence->picture_width; - } - if ( m->info->sequence->picture_height < m->info->sequence->height ) - { - crop[1] = m->info->sequence->height - m->info->sequence->picture_height; - } - - src_w = width - (crop[2] + crop[3]); - src_h = height - (crop[0] + crop[1]); - if ( job ) - { - dst_w = job->title->width; - dst_h = job->title->height; - } - else - { - dst_w = src_w; - dst_h = src_h; - } - - hb_buffer_t *buf = hb_video_buffer_init( dst_w, dst_h ); - buf->s.start = -1; - - AVPicture in, out, pic_crop; - - in.data[0] = y; - in.data[1] = u; - in.data[2] = v; - in.linesize[0] = width; - in.linesize[1] = width>>1; - in.linesize[2] = width>>1; - hb_avpicture_fill( &out, buf ); - - av_picture_crop( &pic_crop, &in, pixfmt, crop[0], crop[2] ); - - if ( !m->sws_context || - m->sws_width != src_w || - m->sws_height != src_h || - m->sws_pix_fmt != pixfmt ) - { - // Source and Dest dimensions may be the same. There is no speed - // cost to using sws_scale to simply copy the data. - m->sws_context = hb_sws_get_context( src_w, src_h, pixfmt, - dst_w, dst_h, buf->f.fmt, - SWS_LANCZOS|SWS_ACCURATE_RND); - m->sws_width = src_w; - m->sws_height = src_h; - m->sws_pix_fmt = pixfmt; - - if ( m->sws_context == NULL ) - { - hb_buffer_close( &buf ); - return NULL; - } - - } - - sws_scale( m->sws_context, (const uint8_t* const *)pic_crop.data, - pic_crop.linesize, 0, src_h, out.data, out.linesize ); - - return buf; -} - -/********************************************************************** - * hb_libmpeg2_decode - ********************************************************************** - * - *********************************************************************/ -static 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; - - if ( buf_es->size ) - { - /* Feed libmpeg2 */ - if( buf_es->s.start >= 0 ) - { - next_tag( m, buf_es ); - m->cc_tag_pending = 1; - } - 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; - } - - // if the user requested captions, process - // any captions found in the current frame. - if ( m->list_subtitle && m->last_pts >= 0 && - have_captions( m->info->user_data, m->info->user_data_len ) ) - { - extract_mpeg2_captions( m ); - // if we don't have a tag for the captions, make one - if ( m->last_cc1_buf && m->tags[m->cur_tag].cc_buf != m->last_cc1_buf ) - { - // If we have not set a CC tag for the picture and - // we have a new CC buffer, make a new tag. - if (!m->cc_tag_pending && m->tags[m->cur_tag].cc_buf != NULL) - { - next_tag( m, buf_es ); - } - else if (m->tags[m->cur_tag].cc_buf) - { - hb_log("mpeg2 tag botch2: pts %"PRId64", tag pts %"PRId64" buf %p", - buf_es->s.start, m->tags[m->cur_tag].start, m->tags[m->cur_tag].cc_buf); - hb_buffer_close( &m->tags[m->cur_tag].cc_buf ); - } - // see if we already made a tag for the timestamp. If so we - // can just use it, otherwise make a new tag. - if (m->tags[m->cur_tag].start == -2) - { - next_tag( m, buf_es ); - } - m->tags[m->cur_tag].cc_buf = m->last_cc1_buf; - } - } - if( state == STATE_PICTURE ) - { - m->cc_tag_pending = 0; - } - else if( state == STATE_SEQUENCE ) - { - if( !( m->width && m->height && m->rate ) ) - { - m->width = m->info->sequence->picture_width; - m->height = m->info->sequence->picture_height; - m->rate = m->info->sequence->frame_period; - if ( m->aspect_ratio <= 0 && m->height && - m->info->sequence->pixel_height ) - { - /* mpeg2_parse doesn't store the aspect ratio. Instead - * it keeps the pixel width & height that would cause - * the storage width & height to come out in the correct - * aspect ratio. Convert these back to aspect ratio. - */ - double ar_numer = m->width * m->info->sequence->pixel_width; - double ar_denom = m->height * m->info->sequence->pixel_height; - m->aspect_ratio = ar_numer / ar_denom; - } - } - if ( m->info->sequence->width >> 1 == m->info->sequence->chroma_width && - m->info->sequence->height >> 1 == m->info->sequence->chroma_height ) - { - m->pixfmt = AV_PIX_FMT_YUV420P; - } - else - { - m->pixfmt = AV_PIX_FMT_YUV422P; - } - } - else if( state == STATE_GOP && m->look_for_break) - { - // we were looking for a gop to add a chapter break - we found it - // so now start looking for an iframe. - m->look_for_iframe = m->look_for_break; - m->look_for_break = 0; - } - else if( ( state == STATE_SLICE || state == STATE_END ) && - m->info->display_fbuf ) - { - m->last_cc1_buf = NULL; - - if( !m->got_iframe && ( m->info->display_picture->flags & - PIC_MASK_CODING_TYPE ) == PIC_FLAG_CODING_TYPE_I ) - { - // we got an iframe so we can start decoding video now - m->got_iframe = 1; - } - - if( m->got_iframe ) - { - buf = hb_copy_frame( m ); - if ( buf == NULL ) - continue; - - buf->sequence = buf_es->sequence; - - hb_buffer_t *cc_buf = NULL; - if( m->info->display_picture->flags & PIC_FLAG_TAGS ) - { - int t = m->info->display_picture->tag; - buf->s.start = m->tags[t].start; - cc_buf = m->tags[t].cc_buf; - m->tags[t].start = -2; - m->tags[t].cc_buf = NULL; - } - if( buf->s.start < 0 && m->last_pts >= 0 ) - { - /* For some reason nb_fields is sometimes 1 while it - should be 2 */ - buf->s.start = m->last_pts + - MAX( 2, m->info->display_picture->nb_fields ) * - m->info->sequence->frame_period / 600; - } - if ( buf->s.start >= 0 ) - { - m->last_pts = buf->s.start; - } - - // if we were accumulating captions we now know the timestamp - // so ship them to the decoder. - if ( cc_buf ) - { - cc_buf->s.start = m->last_pts; - cc_send_to_decoder( m, cc_buf ); - } - - if( m->look_for_iframe && ( m->info->display_picture->flags & - PIC_MASK_CODING_TYPE ) == PIC_FLAG_CODING_TYPE_I ) - { - // we were waiting for an iframe to insert a chapter mark - // and we have one. - int new_chap = m->look_for_iframe; - buf->s.new_chap = new_chap; - - m->look_for_iframe = 0; - const char *chap_name = ""; - if ( m->job && new_chap > 0 && - hb_list_item( m->job->list_chapter, - new_chap - 1 ) ) - { - hb_chapter_t * c = hb_list_item( - m->job->list_chapter, - new_chap - 1 ); - chap_name = c->title; - } - hb_log( "mpeg2: \"%s\" (%d) at frame %u time %"PRId64, - chap_name, new_chap, - m->nframes, buf->s.start ); - } - else if ( m->nframes == 0 ) - { - // this is the first frame returned by the decoder - m->first_pts = buf->s.start; - if ( m->job && hb_list_item( m->job->list_chapter, - m->job->chapter_start - 1 ) ) - { - hb_chapter_t * c = hb_list_item( m->job->list_chapter, - m->job->chapter_start - 1 ); - hb_log( "mpeg2: \"%s\" (%d) at frame %u time %"PRId64, - c->title, m->job->chapter_start, m->nframes, buf->s.start ); - } - } - ++m->nframes; - - m->flag = m->info->display_picture->flags; - -/* Uncomment this block to see frame-by-frame picture flags, as the video encodes. - hb_log("***** MPEG 2 Picture Info for PTS %"PRId64" *****", buf->s.start); - if( m->flag & TOP_FIRST ) - hb_log("MPEG2 Flag: Top field first"); - if( m->flag & PROGRESSIVE ) - hb_log("MPEG2 Flag: Progressive"); - if( m->flag & COMPOSITE ) - hb_log("MPEG2 Flag: Composite"); - if( m->flag & SKIP ) - hb_log("MPEG2 Flag: Skip!"); - if( m->flag & TAGS ) - hb_log("MPEG2 Flag: TAGS"); - if(fm->lag & REPEAT_FIRST ) - hb_log("MPEG2 Flag: Repeat first field"); - if( m->flag & COMPOSITE_MASK ) - hb_log("MPEG2 Flag: Composite mask"); - hb_log("fields: %d", m->info->display_picture->nb_fields); -*/ - /* Rotate the cadence tracking. */ - int i = 0; - for(i=11; i > 0; i--) - { - m->cadence[i] = m->cadence[i-1]; - } - - if ( !(m->flag & PROGRESSIVE) && !(m->flag & TOP_FIRST) ) - { - /* Not progressive, not top first... - That means it's probably bottom - first, 2 fields displayed. - */ - //hb_log("MPEG2 Flag: Bottom field first, 2 fields displayed."); - m->cadence[0] = BT; - } - else if ( !(m->flag & PROGRESSIVE) && (m->flag & TOP_FIRST) ) - { - /* Not progressive, top is first, - Two fields displayed. - */ - //hb_log("MPEG2 Flag: Top field first, 2 fields displayed."); - m->cadence[0] = TB; - } - else if ( (m->flag & PROGRESSIVE) && !(m->flag & TOP_FIRST) && !( m->flag & REPEAT_FIRST ) ) - { - /* Progressive, but noting else. - That means Bottom first, - 2 fields displayed. - */ - //hb_log("MPEG2 Flag: Progressive. Bottom field first, 2 fields displayed."); - m->cadence[0] = BT_PROG; - } - else if ( (m->flag & PROGRESSIVE) && !(m->flag & TOP_FIRST) && ( m->flag & REPEAT_FIRST ) ) - { - /* Progressive, and repeat. . - That means Bottom first, - 3 fields displayed. - */ - //hb_log("MPEG2 Flag: Progressive repeat. Bottom field first, 3 fields displayed."); - m->cadence[0] = BTB_PROG; - } - else if ( (m->flag & PROGRESSIVE) && (m->flag & TOP_FIRST) && !( m->flag & REPEAT_FIRST ) ) - { - /* Progressive, top first. - That means top first, - 2 fields displayed. - */ - //hb_log("MPEG2 Flag: Progressive. Top field first, 2 fields displayed."); - m->cadence[0] = TB_PROG; - } - else if ( (m->flag & PROGRESSIVE) && (m->flag & TOP_FIRST) && ( m->flag & REPEAT_FIRST ) ) - { - /* Progressive, top, repeat. - That means top first, - 3 fields displayed. - */ - //hb_log("MPEG2 Flag: Progressive repeat. Top field first, 3 fields displayed."); - m->cadence[0] = TBT_PROG; - } - - if ( (m->cadence[2] <= TB) && (m->cadence[1] <= TB) && (m->cadence[0] > TB) && (m->cadence[11]) ) - hb_log("%fs: Video -> Film", (float)buf->s.start / 90000); - if ( (m->cadence[2] > TB) && (m->cadence[1] <= TB) && (m->cadence[0] <= TB) && (m->cadence[11]) ) - hb_log("%fs: Film -> Video", (float)buf->s.start / 90000); - - buf->s.flags = m->info->display_picture->flags; - - hb_list_add( list_raw, buf ); - } - } - else if( state == STATE_INVALID ) - { - mpeg2_reset( m->libmpeg2, 0 ); - } - - /* - * Add closed captions to the title if we are scanning (no job). - * - * Just because we don't add this doesn't mean that there aren't any when - * we scan, just that noone said anything. So you should be able to add - * closed captions some other way (See decmpeg2Init() for alternative - * approach of assuming that there are always CC, which is probably - * safer - however I want to leave the autodetect in here for now to - * see how it goes). - */ - if( !m->job && m->title && - have_captions( m->info->user_data, m->info->user_data_len ) ) - { - hb_subtitle_t *subtitle; - int i = 0; - - while ( ( subtitle = hb_list_item( m->title->list_subtitle, i++ ) ) ) - { - /* - * Let's call them 608 subs for now even if they aren't, - * since they are the only types we grok. - */ - if( subtitle->source == CC608SUB ) - { - break; - } - } - - if( ! subtitle ) - { - subtitle = calloc( sizeof( hb_subtitle_t ), 1 ); - subtitle->track = 0; - subtitle->id = 0; - subtitle->format = TEXTSUB; - subtitle->source = CC608SUB; - subtitle->config.dest = PASSTHRUSUB; - subtitle->codec = WORK_DECCC608; - subtitle->type = 5; - snprintf( subtitle->lang, sizeof( subtitle->lang ), "Closed Captions"); - /* - * The language of the subtitles will be the same as the first audio - * track, i.e. the same as the video. - */ - hb_audio_t *audio = hb_list_item( m->title->list_audio, 0 ); - if( audio ) - { - snprintf( subtitle->iso639_2, sizeof( subtitle->iso639_2 ), - "%s", audio->config.lang.iso639_2); - } else { - snprintf( subtitle->iso639_2, sizeof( subtitle->iso639_2 ), "und"); - } - hb_list_add( m->title->list_subtitle, subtitle ); - } - } - } - return 1; -} - -/********************************************************************** - * hb_libmpeg2_close - ********************************************************************** - * - *********************************************************************/ -static void hb_libmpeg2_close( hb_libmpeg2_t ** _m ) -{ - hb_libmpeg2_t * m = *_m; - - mpeg2_close( m->libmpeg2 ); - - if ( m->sws_context ) - { - sws_freeContext( m->sws_context ); - } - - int i; - for ( i = 0; i < NTAGS; ++i ) - { - if ( m->tags[i].cc_buf ) - { - if ( m->tags[i].cc_buf == m->last_cc1_buf ) - m->last_cc1_buf = NULL; - hb_buffer_close( &m->tags[i].cc_buf ); - } - } - if ( m->last_cc1_buf ) - { - hb_buffer_close( &m->last_cc1_buf ); - } - - 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 - ********************************************************************** - * - *********************************************************************/ -static 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(); - - pv->libmpeg2->job = job; - - if( job && job->title ) { - pv->libmpeg2->title = job->title; - } - - /* - * If not scanning, then are we supposed to extract Closed Captions - * and send them to the decoder? - */ - if( job && hb_list_count( job->list_subtitle ) > 0 ) - { - hb_subtitle_t *subtitle; - int i = 0; - - for( i = 0; i < hb_list_count( job->list_subtitle ); i++ ) - while ( ( subtitle = hb_list_item( job->list_subtitle, i++ ) ) != NULL ) - { - if( subtitle->source == CC608SUB ) - { - if ( ! pv->libmpeg2->list_subtitle ) - { - pv->libmpeg2->list_subtitle = hb_list_init(); - } - hb_list_add(pv->libmpeg2->list_subtitle, subtitle); - } - } - } - - return 0; -} - -/********************************************************************** - * Work - ********************************************************************** - * - *********************************************************************/ -static 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_buffer_t * in = *buf_in; - int status = HB_WORK_OK; - - if( w->title && pv && pv->libmpeg2 && !pv->libmpeg2->title ) { - pv->libmpeg2->title = w->title; - } - - // The reader found a chapter break. Remove it from the input - // stream. If we're reading (as opposed to scanning) start looking - // for the next GOP start since that's where the chapter begins. - if( in->s.new_chap ) - { - if ( pv->libmpeg2->job ) - { - pv->libmpeg2->look_for_break = in->s.new_chap; - } - in->s.new_chap = 0; - } - - hb_libmpeg2_decode( pv->libmpeg2, in, pv->list ); - - /* if we got an empty buffer signaling end-of-stream send it downstream */ - if ( in->size == 0 ) - { - hb_list_add( pv->list, in ); - *buf_in = NULL; - status = HB_WORK_DONE; - - /* - * Purge any pending caption buffer then let the Closed Captions decoder - * know that it is the end of the data. - */ - if ( pv->libmpeg2->list_subtitle ) - { - if ( pv->libmpeg2->last_cc1_buf ) - { - cc_send_to_decoder( pv->libmpeg2, pv->libmpeg2->last_cc1_buf ); - if ( pv->libmpeg2->tags[pv->libmpeg2->cur_tag].cc_buf == - pv->libmpeg2->last_cc1_buf ) - { - pv->libmpeg2->tags[pv->libmpeg2->cur_tag].cc_buf = NULL; - } - pv->libmpeg2->last_cc1_buf = NULL; - } - cc_send_to_decoder( pv->libmpeg2, hb_buffer_init( 0 ) ); - } - } - - *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 status; -} - -/********************************************************************** - * Close - ********************************************************************** - * - *********************************************************************/ -static void decmpeg2Close( hb_work_object_t * w ) -{ - hb_work_private_t * pv = w->private_data; - - // don't log during scan - if ( pv->libmpeg2->job ) - { - hb_log( "mpeg2 done: %d frames", pv->libmpeg2->nframes ); - } - hb_list_empty( &pv->list ); - if ( pv->libmpeg2->list_subtitle ) - { - hb_list_close( &pv->libmpeg2->list_subtitle ); - } - hb_libmpeg2_close( &pv->libmpeg2 ); - free( pv ); -} - -static int decmpeg2Info( hb_work_object_t *w, hb_work_info_t *info ) -{ - hb_work_private_t *pv = w->private_data; - - memset( info, 0, sizeof(*info) ); - - if ( pv && pv->libmpeg2 && pv->libmpeg2->info && pv->libmpeg2->info->sequence ) - { - hb_libmpeg2_t *m = pv->libmpeg2; - - info->width = m->width; - info->height = m->height; - info->pixel_aspect_width = m->info->sequence->pixel_width; - info->pixel_aspect_height = m->info->sequence->pixel_height; - - // if the frame is progressive & NTSC DVD height report it as 23.976 FPS - // so that scan can autodetect NTSC film - info->rate = 27000000; - info->rate_base = ( m->info->display_fbuf && m->info->display_picture && - (m->info->display_picture->flags & PROGRESSIVE) && - (m->height == 480 ) ) ? 1126125 : m->rate; - - info->name = "mpeg2"; - info->video_decode_support = HB_DECODE_SUPPORT_SW; - info->bitrate = m->info->sequence->byte_rate * 8; - info->profile = m->info->sequence->profile_level_id >> 4; - info->level = m->info->sequence->profile_level_id & 0xf; - - if( pv->libmpeg2->info->sequence->flags & SEQ_FLAG_COLOUR_DESCRIPTION ) - { - switch( pv->libmpeg2->info->sequence->colour_primaries ) - { - case 1: // ITU-R Recommendation 709 - info->color_prim = HB_COLR_PRI_BT709; - break; - case 5: // ITU-R Recommendation 624-4 System B, G - info->color_prim = HB_COLR_PRI_EBUTECH; - break; - case 4: // ITU-R Recommendation 624-4 System M - case 6: // SMPTE 170M - case 7: // SMPTE 240M - info->color_prim = HB_COLR_PRI_SMPTEC; - break; - default: - info->color_prim = HB_COLR_PRI_UNDEF; - break; - } - switch( pv->libmpeg2->info->sequence->transfer_characteristics ) - { - case 1: // ITU-R Recommendation 709 - case 4: // ITU-R Recommendation 624-4 System M - case 5: // ITU-R Recommendation 624-4 System B, G - case 6: // SMPTE 170M - info->color_transfer = HB_COLR_TRA_BT709; - break; - case 7: // SMPTE 240M - info->color_transfer = HB_COLR_TRA_SMPTE240M; - break; - default: - info->color_transfer = HB_COLR_TRA_UNDEF; - break; - } - switch( pv->libmpeg2->info->sequence->matrix_coefficients ) - { - case 1: // ITU-R Recommendation 709 - info->color_matrix = HB_COLR_MAT_BT709; - break; - case 4: // FCC - case 5: // ITU-R Recommendation 624-4 System B, G - case 6: // SMPTE 170M - info->color_matrix = HB_COLR_MAT_SMPTE170M; - break; - case 7: // SMPTE 240M - info->color_matrix = HB_COLR_MAT_SMPTE240M; - break; - default: - info->color_matrix = HB_COLR_MAT_UNDEF; - break; - } - } - else if( ( info->width >= 1280 || info->height >= 720 ) || - ( info->width > 720 && info->height > 576 ) ) - { - // ITU BT.709 HD content - info->color_prim = HB_COLR_PRI_BT709; - info->color_transfer = HB_COLR_TRA_BT709; - info->color_matrix = HB_COLR_MAT_BT709; - } - else if( info->rate_base == 1080000 ) - { - // ITU BT.601 DVD or SD TV content (PAL) - info->color_prim = HB_COLR_PRI_EBUTECH; - info->color_transfer = HB_COLR_TRA_BT709; - info->color_matrix = HB_COLR_MAT_SMPTE170M; - } - else - { - // ITU BT.601 DVD or SD TV content (NTSC) - info->color_prim = HB_COLR_PRI_SMPTEC; - info->color_transfer = HB_COLR_TRA_BT709; - info->color_matrix = HB_COLR_MAT_SMPTE170M; - } - - return 1; - } - return 0; -} - -static void decmpeg2Flush( hb_work_object_t *w ) -{ - hb_work_private_t * pv = w->private_data; - - mpeg2_reset( pv->libmpeg2->libmpeg2, 0 ); - pv->libmpeg2->got_iframe = 0; -} - -hb_work_object_t hb_decmpeg2 = -{ - .id = WORK_DECMPEG2, - .name = "MPEG-2 decoder (libmpeg2)", - .init = decmpeg2Init, - .work = decmpeg2Work, - .close = decmpeg2Close, - .flush = decmpeg2Flush, - .info = decmpeg2Info -}; - diff --git a/libhb/decomb.c b/libhb/decomb.c index a05605d0d..040cdbebc 100644 --- a/libhb/decomb.c +++ b/libhb/decomb.c @@ -68,7 +68,6 @@ which will feed EEDI2 interpolations to yadif. #include "hb.h" #include "hbffmpeg.h" -#include "mpeg2dec/mpeg2.h" #include "eedi2.h" #include "taskset.h" diff --git a/libhb/deinterlace.c b/libhb/deinterlace.c index 69b1c31bc..44ff88d90 100644 --- a/libhb/deinterlace.c +++ b/libhb/deinterlace.c @@ -18,7 +18,6 @@ #include "hb.h" #include "hbffmpeg.h" -#include "mpeg2dec/mpeg2.h" #include "taskset.h" // yadif_mode is a bit vector with the following flags diff --git a/libhb/denoise.c b/libhb/denoise.c index 626bf18ad..9308d041f 100644 --- a/libhb/denoise.c +++ b/libhb/denoise.c @@ -19,7 +19,6 @@ #include "hb.h" #include "hbffmpeg.h" -#include "mpeg2dec/mpeg2.h" #define HQDN3D_SPATIAL_LUMA_DEFAULT 4.0f #define HQDN3D_SPATIAL_CHROMA_DEFAULT 3.0f diff --git a/libhb/detelecine.c b/libhb/detelecine.c index 2fdc48038..67699de67 100644 --- a/libhb/detelecine.c +++ b/libhb/detelecine.c @@ -9,7 +9,6 @@ #include "hb.h" #include "hbffmpeg.h" -#include "mpeg2dec/mpeg2.h" /* * diff --git a/libhb/hb.c b/libhb/hb.c index b9730802d..2b9609aa6 100644 --- a/libhb/hb.c +++ b/libhb/hb.c @@ -1656,7 +1656,6 @@ int hb_global_init() hb_register(&hb_decavcodeca); hb_register(&hb_declpcm); hb_register(&hb_deccc608); - hb_register(&hb_decmpeg2); hb_register(&hb_decpgssub); hb_register(&hb_decsrtsub); hb_register(&hb_decssasub); diff --git a/libhb/internal.h b/libhb/internal.h index 24e29932e..6fa74d591 100644 --- a/libhb/internal.h +++ b/libhb/internal.h @@ -7,8 +7,6 @@ For full terms see the file COPYING file or visit http://www.gnu.org/licenses/gpl-2.0.html */ -#define USE_FF_MPEG2 - #include "hbffmpeg.h" #include "extras/cl.h" @@ -409,9 +407,9 @@ union hb_esconfig_u enum { - WORK_SYNC_VIDEO = 1, + WORK_NONE = 0, + WORK_SYNC_VIDEO, WORK_SYNC_AUDIO, - WORK_DECMPEG2, WORK_DECCC608, WORK_DECVOBSUB, WORK_DECSRTSUB, diff --git a/libhb/module.defs b/libhb/module.defs index 3102beafa..23f8d9863 100644 --- a/libhb/module.defs +++ b/libhb/module.defs @@ -35,9 +35,6 @@ LIBHB.out += $(LIBHB.a) ############################################################################### -ifeq (1,$(FEATURE.ff.mpeg2)) -LIBHB.GCC.D += USE_FF_MPEG2 -endif ifeq (1,$(FEATURE.fdk_aac)) LIBHB.GCC.D += USE_FDK_AAC endif diff --git a/libhb/scan.c b/libhb/scan.c index cc36fe5da..833589f6c 100644 --- a/libhb/scan.c +++ b/libhb/scan.c @@ -517,15 +517,12 @@ static int DecodePreviews( hb_scan_t * data, hb_title_t * title ) data->stream = hb_stream_open( title->path, title, 1 ); } - int vcodec = title->video_codec? title->video_codec : WORK_DECMPEG2; -#if defined(USE_FF_MPEG2) - if (vcodec == WORK_DECMPEG2) + if (title->video_codec == WORK_NONE) { - vcodec = WORK_DECAVCODECV; - title->video_codec_param = AV_CODEC_ID_MPEG2VIDEO; + hb_error("No video decoder set!"); + return 0; } -#endif - hb_work_object_t *vid_decoder = hb_get_work( vcodec ); + hb_work_object_t *vid_decoder = hb_get_work(title->video_codec); vid_decoder->codec_param = title->video_codec_param; vid_decoder->title = title; vid_decoder->init( vid_decoder, NULL ); diff --git a/libhb/stream.c b/libhb/stream.c index 1cb45fcad..6378da3a2 100644 --- a/libhb/stream.c +++ b/libhb/stream.c @@ -49,8 +49,8 @@ typedef struct { static const stream2codec_t st2codec[256] = { st(0x00, U, 0, 0, NULL), - st(0x01, V, WORK_DECMPEG2, 0, "MPEG1"), - st(0x02, V, WORK_DECMPEG2, AV_CODEC_ID_MPEG2VIDEO, "MPEG2"), + st(0x01, V, WORK_DECAVCODEC, AV_CODEC_ID_MPEG2VIDEO, "MPEG1"), + st(0x02, V, WORK_DECAVCODEC, AV_CODEC_ID_MPEG2VIDEO, "MPEG2"), st(0x03, A, HB_ACODEC_FFMPEG, AV_CODEC_ID_MP2, "MPEG1"), st(0x04, A, HB_ACODEC_FFMPEG, AV_CODEC_ID_MP2, "MPEG2"), st(0x05, N, 0, 0, "ISO 13818-1 private section"), @@ -4211,12 +4211,12 @@ static int do_probe( hb_pes_stream_t *pes, hb_buffer_t *buf ) switch ( codec->id ) { case AV_CODEC_ID_MPEG1VIDEO: - pes->codec = WORK_DECMPEG2; + pes->codec = WORK_DECAVCODECV; pes->stream_type = 0x01; break; case AV_CODEC_ID_MPEG2VIDEO: - pes->codec = WORK_DECMPEG2; + pes->codec = WORK_DECAVCODECV; pes->stream_type = 0x02; break; diff --git a/libhb/work.c b/libhb/work.c index 7bb8eab4f..05f76d46e 100644 --- a/libhb/work.c +++ b/libhb/work.c @@ -1154,16 +1154,12 @@ static void do_job(hb_job_t *job) sync = hb_sync_init( job ); /* Video decoder */ - int vcodec = title->video_codec? title->video_codec : WORK_DECMPEG2; -#if defined(USE_FF_MPEG2) - if (vcodec == WORK_DECMPEG2) + if (title->video_codec == WORK_NONE) { - vcodec = WORK_DECAVCODECV; - title->video_codec_param = AV_CODEC_ID_MPEG2VIDEO; + hb_error("No video decoder set!"); + goto cleanup; } -#endif - - hb_list_add( job->list_work, ( w = hb_get_work( vcodec ) ) ); + hb_list_add(job->list_work, (w = hb_get_work(title->video_codec))); w->codec_param = title->video_codec_param; w->fifo_in = job->fifo_mpeg2; w->fifo_out = job->fifo_raw; |