1 /* $Id: scan.c,v 1.52 2005/11/25 15:05:25 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. */
8 #include "a52dec/a52.h"
11 #define HB_MAX_PREVIEWS 30 // 30 previews = every 5 minutes of a 2.5 hour video
20 hb_list_t * list_title;
31 static void ScanFunc( void * );
32 static int DecodePreviews( hb_scan_t *, hb_title_t * title );
33 static void LookForAudio( hb_title_t * title, hb_buffer_t * b );
34 static int AllAudioOK( hb_title_t * title );
36 static const char *aspect_to_string( double aspect )
38 switch ( (int)(aspect * 9.) )
40 case 9 * 4 / 3: return "4:3";
41 case 9 * 16 / 9: return "16:9";
43 static char arstr[32];
44 sprintf( arstr, aspect >= 1.? "%.2f:1" : "1:%.2f", aspect );
48 hb_thread_t * hb_scan_init( hb_handle_t * handle, volatile int * die,
49 const char * path, int title_index,
50 hb_list_t * list_title, int preview_count,
53 hb_scan_t * data = calloc( sizeof( hb_scan_t ), 1 );
57 data->path = strdup( path );
58 data->title_index = title_index;
59 data->list_title = list_title;
61 data->preview_count = preview_count;
62 data->store_previews = store_previews;
64 return hb_thread_init( "scan", ScanFunc, data, HB_NORMAL_PRIORITY );
67 static void ScanFunc( void * _data )
69 hb_scan_t * data = (hb_scan_t *) _data;
76 /* Try to open the path as a DVD. If it fails, try as a file */
77 hb_log( "scan: trying to open with libdvdread" );
78 if( ( data->dvd = hb_dvd_init( data->path ) ) )
80 hb_log( "scan: DVD has %d title(s)",
81 hb_dvd_title_count( data->dvd ) );
82 if( data->title_index )
84 /* Scan this title only */
85 hb_list_add( data->list_title, hb_dvd_title_scan( data->dvd,
86 data->title_index ) );
91 for( i = 0; i < hb_dvd_title_count( data->dvd ); i++ )
93 hb_list_add( data->list_title,
94 hb_dvd_title_scan( data->dvd, i + 1 ) );
98 else if ( ( data->batch = hb_batch_init( data->path ) ) )
102 /* Scan all titles */
103 for( i = 0; i < hb_batch_title_count( data->batch ); i++ )
107 title = hb_batch_title_scan( data->batch, i );
111 hb_list_add( data->list_title, title );
115 else if ( (data->stream = hb_stream_open( data->path, 0 ) ) != NULL )
117 hb_list_add( data->list_title, hb_stream_title_scan( data->stream ) );
121 hb_log( "scan: unrecognized file type" );
125 for( i = 0; i < hb_list_count( data->list_title ); )
135 title = hb_list_item( data->list_title, i );
137 #define p state.param.scanning
139 state.state = HB_STATE_SCANNING;
140 p.title_cur = title->index;
141 p.title_count = data->dvd ? hb_dvd_title_count( data->dvd ) : hb_list_count(data->list_title);
142 hb_set_state( data->h, &state );
145 /* Decode previews */
146 /* this will also detect more AC3 / DTS information */
147 if( !DecodePreviews( data, title ) )
149 /* TODO: free things */
150 hb_list_rem( data->list_title, title );
154 /* Make sure we found audio rates and bitrates */
155 for( j = 0; j < hb_list_count( title->list_audio ); )
157 audio = hb_list_item( title->list_audio, j );
158 if( !audio->config.in.bitrate )
160 hb_log( "scan: removing audio 0x%x because no bitrate found",
162 hb_list_rem( title->list_audio, audio );
172 /* Init jobs templates */
173 for( i = 0; i < hb_list_count( data->list_title ); i++ )
177 title = hb_list_item( data->list_title, i );
178 job = calloc( sizeof( hb_job_t ), 1 );
183 /* Set defaults settings */
184 job->chapter_start = 1;
185 job->chapter_end = hb_list_count( title->list_chapter );
187 /* Autocrop by default. Gnark gnark */
188 memcpy( job->crop, title->crop, 4 * sizeof( int ) );
190 /* Preserve a source's pixel aspect, if it's available. */
191 if( title->pixel_aspect_width && title->pixel_aspect_height )
193 job->anamorphic.par_width = title->pixel_aspect_width;
194 job->anamorphic.par_height = title->pixel_aspect_height;
197 if( title->aspect != 0 && title->aspect != 1. &&
198 !job->anamorphic.par_width && !job->anamorphic.par_height)
200 hb_reduce( &job->anamorphic.par_width, &job->anamorphic.par_height,
201 (int)(title->aspect * title->height + 0.5), title->width );
204 job->width = title->width - job->crop[2] - job->crop[3];
205 hb_fix_aspect( job, HB_KEEP_WIDTH );
206 if( job->height > title->height - job->crop[0] - job->crop[1] )
208 job->height = title->height - job->crop[0] - job->crop[1];
209 hb_fix_aspect( job, HB_KEEP_HEIGHT );
212 hb_log( "scan: title (%d) job->width:%d, job->height:%d",
213 i, job->width, job->height );
217 job->vcodec = HB_VCODEC_FFMPEG;
218 job->vquality = -1.0;
219 job->vbitrate = 1000;
221 job->vrate = title->rate;
222 job->vrate_base = title->rate_base;
224 job->list_audio = hb_list_init();
225 job->list_subtitle = hb_list_init();
227 job->mux = HB_MUX_MP4;
234 hb_dvd_close( &data->dvd );
238 hb_stream_close(&data->stream);
242 hb_batch_close( &data->batch );
249 // -----------------------------------------------
250 // stuff related to cropping
254 static inline int absdiff( int x, int y )
256 return x < y ? y - x : x - y;
259 static inline int clampBlack( int x )
261 // luma 'black' is 16 and anything less should be clamped at 16
262 return x < 16 ? 16 : x;
265 static int row_all_dark( hb_title_t *title, uint8_t* luma, int row )
267 luma += title->width * row;
269 // compute the average luma value of the row
271 for ( i = 0; i < title->width; ++i )
273 avg += clampBlack( luma[i] );
279 // since we're trying to detect smooth borders, only take the row if
280 // all pixels are within +-16 of the average (this range is fairly coarse
281 // but there's a lot of quantization noise for luma values near black
282 // so anything less will fail to crop because of the noise).
283 for ( i = 0; i < title->width; ++i )
285 if ( absdiff( avg, clampBlack( luma[i] ) ) > 16 )
291 static int column_all_dark( hb_title_t *title, uint8_t* luma, int top, int bottom,
294 int stride = title->width;
295 int height = title->height - top - bottom;
296 luma += stride * top + col;
298 // compute the average value of the column
299 int i = height, avg = 0, row = 0;
300 for ( ; --i >= 0; row += stride )
302 avg += clampBlack( luma[row] );
308 // since we're trying to detect smooth borders, only take the column if
309 // all pixels are within +-16 of the average.
311 for ( ; --i >= 0; row += stride )
313 if ( absdiff( avg, clampBlack( luma[row] ) ) > 16 )
322 int t[HB_MAX_PREVIEWS];
323 int b[HB_MAX_PREVIEWS];
324 int l[HB_MAX_PREVIEWS];
325 int r[HB_MAX_PREVIEWS];
328 static void record_crop( crop_record_t *crops, int t, int b, int l, int r )
330 crops->t[crops->n] = t;
331 crops->b[crops->n] = b;
332 crops->l[crops->n] = l;
333 crops->r[crops->n] = r;
337 static int compare_int( const void *a, const void *b )
339 return *(const int *)a - *(const int *)b;
342 static void sort_crops( crop_record_t *crops )
344 qsort( crops->t, crops->n, sizeof(crops->t[0]), compare_int );
345 qsort( crops->b, crops->n, sizeof(crops->t[0]), compare_int );
346 qsort( crops->l, crops->n, sizeof(crops->t[0]), compare_int );
347 qsort( crops->r, crops->n, sizeof(crops->t[0]), compare_int );
350 // -----------------------------------------------
351 // stuff related to title width/height/aspect info
354 int count; /* number of times we've seen this info entry */
355 hb_work_info_t info; /* copy of info entry */
358 static void remember_info( info_list_t *info_list, hb_work_info_t *info )
360 for ( ; info_list->count; ++info_list )
362 if ( memcmp( &info_list->info, info, sizeof(*info) ) == 0 )
364 // we found a match - bump its count
369 // no match found - add new entry to list (info_list points to
370 // the first free slot). NB - we assume that info_list was allocated
371 // so that it's big enough even if there are no dups. I.e., 10 slots
372 // allocated if there are 10 previews.
373 info_list->count = 1;
374 info_list->info = *info;
377 static void most_common_info( info_list_t *info_list, hb_work_info_t *info )
380 for ( i = 1; info_list[i].count; ++i )
382 if ( info_list[i].count > info_list[biggest].count )
385 *info = info_list[biggest].info;
389 /***********************************************************************
391 ***********************************************************************
392 * Decode 10 pictures for the given title.
393 * It assumes that data->reader and data->vts have successfully been
394 * DVDOpen()ed and ifoOpen()ed.
395 **********************************************************************/
396 static int DecodePreviews( hb_scan_t * data, hb_title_t * title )
398 int i, npreviews = 0;
399 hb_buffer_t * buf_ps, * buf_es;
401 int progressive_count = 0;
402 int interlaced_preview_count = 0;
403 info_list_t * info_list = calloc( data->preview_count+1, sizeof(*info_list) );
404 crop_record_t *crops = calloc( 1, sizeof(*crops) );
406 buf_ps = hb_buffer_init( HB_DVD_READ_BUFFER_SIZE );
407 list_es = hb_list_init();
409 hb_log( "scan: decoding previews for title %d", title->index );
413 hb_dvd_start( data->dvd, title, 1 );
414 title->angle_count = hb_dvd_angle_count( data->dvd );
415 hb_log( "scan: title angle(s) %d", title->angle_count );
417 else if (data->batch)
419 data->stream = hb_stream_open( title->path, title );
422 for( i = 0; i < data->preview_count; i++ )
434 if( !hb_dvd_seek( data->dvd, (float) ( i + 1 ) / ( data->preview_count + 1.0 ) ) )
439 else if (data->stream)
441 /* we start reading streams at zero rather than 1/11 because
442 * short streams may have only one sequence header in the entire
443 * file and we need it to decode any previews. */
444 if (!hb_stream_seek(data->stream, (float) i / ( data->preview_count + 1.0 ) ) )
450 hb_deep_log( 2, "scan: preview %d", i + 1 );
452 int vcodec = title->video_codec? title->video_codec : WORK_DECMPEG2;
453 hb_work_object_t *vid_decoder = hb_get_work( vcodec );
454 vid_decoder->codec_param = title->video_codec_param;
455 vid_decoder->title = title;
456 vid_decoder->init( vid_decoder, NULL );
457 hb_buffer_t * vid_buf = NULL;
460 if ( title->flags & HBTF_NO_IDR )
462 // title doesn't have IDR frames so we decode but drop one second's
463 // worth of frames to allow the decoder to converge.
464 if ( ! title->rate_base )
470 vidskip = (double)title->rate / (double)title->rate_base + 0.5;
474 for( j = 0; j < 10240 ; j++ )
478 if( !hb_dvd_read( data->dvd, buf_ps ) )
484 hb_log( "Warning: Could not read data for preview %d, skipped", i + 1 );
488 else if (data->stream)
490 if ( !hb_stream_read(data->stream,buf_ps) )
496 hb_log( "Warning: Could not read data for preview %d, skipped", i + 1 );
500 (hb_demux[title->demuxer])(buf_ps, list_es, 0 );
502 while( ( buf_es = hb_list_item( list_es, 0 ) ) )
504 hb_list_rem( list_es, buf_es );
505 if( buf_es->id == title->video_id && vid_buf == NULL )
507 vid_decoder->work( vid_decoder, &buf_es, &vid_buf );
508 if ( vid_buf && vidskip && --vidskip > 0 )
510 // we're dropping frames to get the video decoder in sync
511 // when the video stream doesn't contain IDR frames
512 hb_buffer_close( &vid_buf );
516 else if( ! AllAudioOK( title ) )
518 LookForAudio( title, buf_es );
521 hb_buffer_close( &buf_es );
524 if( vid_buf && AllAudioOK( title ) )
530 hb_log( "scan: could not get a decoded picture" );
534 /* Get size and rate infos */
536 hb_work_info_t vid_info;
537 if( !vid_decoder->info( vid_decoder, &vid_info ) )
540 * Could not fill vid_info, don't continue and try to use vid_info
543 vid_decoder->close( vid_decoder );
547 vid_decoder->close( vid_decoder );
550 remember_info( info_list, &vid_info );
552 title->video_codec_name = strdup( vid_info.name );
553 title->width = vid_info.width;
554 title->height = vid_info.height;
555 title->rate = vid_info.rate;
556 title->rate_base = vid_info.rate_base;
557 title->video_bitrate = vid_info.bitrate;
559 if( title->rate_base == 1126125 )
561 /* Frame FPS is 23.976 (meaning it's progressive), so
562 start keeping track of how many are reporting at
563 that speed. When enough show up that way, we want
564 to make that the overall title FPS.
568 if( progressive_count < 6 )
570 /* Not enough frames are reporting as progressive,
571 which means we should be conservative and use
572 29.97 as the title's FPS for now.
574 title->rate_base = 900900;
578 /* A majority of the scan frames are progressive. Make that
579 the title's FPS, and announce it once to the log.
581 if( progressive_count == 6 )
583 hb_deep_log( 2, "Title's mostly NTSC Film, setting fps to 23.976");
585 title->rate_base = 1126125;
588 else if( title->rate_base == 900900 && progressive_count >= 6 )
591 * We've already deduced that the frame rate is 23.976, so set it
594 title->rate_base = 1126125;
597 while( ( buf_es = hb_list_item( list_es, 0 ) ) )
599 hb_list_rem( list_es, buf_es );
600 hb_buffer_close( &buf_es );
603 /* Check preview for interlacing artifacts */
604 if( hb_detect_comb( vid_buf, title->width, title->height, 10, 30, 9, 10, 30, 9 ) )
606 hb_deep_log( 2, "Interlacing detected in preview frame %i", i+1);
607 interlaced_preview_count++;
610 if( data->store_previews )
612 hb_get_tempory_filename( data->h, filename, "%" PRIxPTR "%d",
613 (intptr_t)title, i );
615 file_preview = fopen( filename, "wb" );
618 fwrite( vid_buf->data, title->width * title->height * 3 / 2,
620 fclose( file_preview );
624 hb_log( "scan: fopen failed (%s)", filename );
628 /* Detect black borders */
630 #define Y vid_buf->data
631 int top, bottom, left, right;
632 int h4 = title->height / 4, w4 = title->width / 4;
634 // When widescreen content is matted to 16:9 or 4:3 there's sometimes
635 // a thin border on the outer edge of the matte. On TV content it can be
636 // "line 21" VBI data that's normally hidden in the overscan. For HD
637 // content it can just be a diagnostic added in post production so that
638 // the frame borders are visible. We try to ignore these borders so
639 // we can crop the matte. The border width depends on the resolution
640 // (12 pixels on 1080i looks visually the same as 4 pixels on 480i)
641 // so we allow the border to be up to 1% of the frame height.
642 const int border = title->height / 100;
644 for ( top = border; top < h4; ++top )
646 if ( ! row_all_dark( title, Y, top ) )
651 // we never made it past the border region - see if the rows we
652 // didn't check are dark or if we shouldn't crop at all.
653 for ( top = 0; top < border; ++top )
655 if ( ! row_all_dark( title, Y, top ) )
663 for ( bottom = border; bottom < h4; ++bottom )
665 if ( ! row_all_dark( title, Y, title->height - 1 - bottom ) )
668 if ( bottom <= border )
670 for ( bottom = 0; bottom < border; ++bottom )
672 if ( ! row_all_dark( title, Y, title->height - 1 - bottom ) )
675 if ( bottom >= border )
680 for ( left = 0; left < w4; ++left )
682 if ( ! column_all_dark( title, Y, top, bottom, left ) )
685 for ( right = 0; right < w4; ++right )
687 if ( ! column_all_dark( title, Y, top, bottom, title->width - 1 - right ) )
691 // only record the result if all the crops are less than a quarter of
692 // the frame otherwise we can get fooled by frames with a lot of black
693 // like titles, credits & fade-thru-black transitions.
694 if ( top < h4 && bottom < h4 && left < w4 && right < w4 )
696 record_crop( crops, top, bottom, left, right );
702 hb_buffer_close( &vid_buf );
705 if ( data->batch && data->stream )
707 hb_stream_close( &data->stream );
712 // use the most common frame info for our final title dimensions
713 hb_work_info_t vid_info;
714 most_common_info( info_list, &vid_info );
716 title->width = vid_info.width;
717 title->height = vid_info.height;
718 title->pixel_aspect_width = vid_info.pixel_aspect_width;
719 title->pixel_aspect_height = vid_info.pixel_aspect_height;
721 // compute the aspect ratio based on the storage dimensions and the
722 // pixel aspect ratio (if supplied) or just storage dimensions if no PAR.
723 title->aspect = (double)title->width / (double)title->height;
724 if( title->pixel_aspect_width && title->pixel_aspect_height )
726 title->aspect *= (double)title->pixel_aspect_width /
727 (double)title->pixel_aspect_height;
729 // For unknown reasons some French PAL DVDs put the original
730 // content's aspect ratio into the mpeg PAR even though it's
731 // the wrong PAR for the DVD. Apparently they rely on the fact
732 // that DVD players ignore the content PAR and just use the
733 // aspect ratio from the DVD metadata. So, if the aspect computed
734 // from the PAR is different from the container's aspect we use
735 // the container's aspect & recompute the PAR from it.
736 if( title->container_aspect && (int)(title->aspect * 9) != (int)(title->container_aspect * 9) )
738 hb_log("scan: content PAR gives wrong aspect %.2f; "
739 "using container aspect %.2f", title->aspect,
740 title->container_aspect );
741 title->aspect = title->container_aspect;
742 hb_reduce( &title->pixel_aspect_width, &title->pixel_aspect_height,
743 (int)(title->aspect * title->height + 0.5), title->width );
747 // don't try to crop unless we got at least 3 previews
751 // The next line selects median cropping - at least
752 // 50% of the frames will have their borders removed.
753 // Other possible choices are loose cropping (i = 0) where
754 // no non-black pixels will be cropped from any frame and a
755 // tight cropping (i = crops->n - (crops->n >> 2)) where at
756 // least 75% of the frames will have their borders removed.
758 title->crop[0] = EVEN( crops->t[i] );
759 title->crop[1] = EVEN( crops->b[i] );
760 title->crop[2] = EVEN( crops->l[i] );
761 title->crop[3] = EVEN( crops->r[i] );
765 hb_log( "scan: %d previews, %dx%d, %.3f fps, autocrop = %d/%d/%d/%d, "
766 "aspect %s, PAR %d:%d",
767 npreviews, title->width, title->height, (float) title->rate /
768 (float) title->rate_base,
769 title->crop[0], title->crop[1], title->crop[2], title->crop[3],
770 aspect_to_string( title->aspect ), title->pixel_aspect_width,
771 title->pixel_aspect_height );
773 if( interlaced_preview_count >= ( npreviews / 2 ) )
775 hb_log("Title is likely interlaced or telecined (%i out of %i previews). You should do something about that.",
776 interlaced_preview_count, npreviews);
777 title->detected_interlacing = 1;
781 title->detected_interlacing = 0;
785 hb_buffer_close( &buf_ps );
786 while( ( buf_es = hb_list_item( list_es, 0 ) ) )
788 hb_list_rem( list_es, buf_es );
789 hb_buffer_close( &buf_es );
791 hb_list_close( &list_es );
793 hb_dvd_stop( data->dvd );
799 * This routine is called for every frame from a non-video elementary stream.
800 * These are a mix of audio & subtitle streams, some of which we want & some
801 * we're ignoring. This routine checks the frame against all our audio streams
802 * to see if it's one we want and haven't identified yet. If yes, it passes the
803 * frame to a codec-specific id routine which is responsible for filling in
804 * the sample rate, bit rate, channels & other audio parameters.
806 * Since a sample rate is essential for further audio processing, any audio
807 * stream which isn't successfully id'd by is deleted at the end of the scan.
808 * This is necessary to avoid ambiguities where things that might be audio
809 * aren't (e.g., some European DVD Teletext streams use the same IDs as US ATSC
812 static void LookForAudio( hb_title_t * title, hb_buffer_t * b )
816 hb_audio_t * audio = NULL;
817 for( i = 0; i < hb_list_count( title->list_audio ); i++ )
819 audio = hb_list_item( title->list_audio, i );
820 /* check if this elementary stream is one we want */
821 if ( audio->id == b->id )
830 if( !audio || audio->config.in.bitrate != 0 )
832 /* not found or already done */
836 hb_work_object_t *w = hb_codec_decoder( audio->config.in.codec );
838 if ( w == NULL || w->bsinfo == NULL )
840 hb_log( "Internal error in scan: unhandled audio type %d for id 0x%x",
841 audio->config.in.codec, audio->id );
847 w->codec_param = audio->config.in.codec_param;
848 int ret = w->bsinfo( w, b, &info );
851 hb_log( "no info on audio type %d/0x%x for id 0x%x",
852 audio->config.in.codec, audio->config.in.codec_param,
858 /* didn't find any info */
861 audio->config.in.samplerate = info.rate;
862 audio->config.in.bitrate = info.bitrate;
863 audio->config.in.channel_layout = info.channel_layout;
864 audio->config.in.version = info.version;
865 audio->config.in.mode = info.mode;
866 audio->config.flags.ac3 = info.flags;
868 // update the audio description string based on the info we found
869 if ( audio->config.flags.ac3 & AUDIO_F_DOLBY )
871 strcat( audio->config.lang.description, " (Dolby Surround)" );
875 int layout = audio->config.in.channel_layout;
876 char *desc = audio->config.lang.description +
877 strlen( audio->config.lang.description );
878 sprintf( desc, " (%d.%d ch)",
879 HB_INPUT_CH_LAYOUT_GET_DISCRETE_FRONT_COUNT(layout) +
880 HB_INPUT_CH_LAYOUT_GET_DISCRETE_REAR_COUNT(layout),
881 HB_INPUT_CH_LAYOUT_GET_DISCRETE_LFE_COUNT(layout) );
884 hb_log( "scan: audio 0x%x: %s, rate=%dHz, bitrate=%d %s", audio->id,
885 info.name, audio->config.in.samplerate, audio->config.in.bitrate,
886 audio->config.lang.description );
891 // We get here if there's no hope of finding info on an audio bitstream,
892 // either because we don't have a decoder (or a decoder with a bitstream
893 // info proc) or because the decoder's info proc said that the stream
894 // wasn't something it could handle. Delete the item from the title's
895 // audio list so we won't keep reading packets while trying to get its
901 hb_list_rem( title->list_audio, audio );
905 * This routine checks to see if we've ID'd all the audio streams associated
906 * with a title. It returns 0 if there are more to ID & 1 if all are done.
908 static int AllAudioOK( hb_title_t * title )
913 for( i = 0; i < hb_list_count( title->list_audio ); i++ )
915 audio = hb_list_item( title->list_audio, i );
916 if( audio->config.in.bitrate == 0 )