1 /* $Id: common.c,v 1.15 2005/03/17 19:22:47 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. */
15 /**********************************************************************
17 *********************************************************************/
18 hb_rate_t hb_video_rates[] =
19 { { "5", 5400000 }, { "10", 2700000 }, { "12", 2250000 },
20 { "15", 1800000 }, { "23.976", 1126125 }, { "24", 1125000 },
21 { "25", 1080000 }, { "29.97", 900900 } };
22 int hb_video_rates_count = sizeof( hb_video_rates ) /
25 hb_rate_t hb_audio_rates[] =
26 { { "22.05", 22050 }, { "24", 24000 }, { "32", 32000 },
27 { "44.1", 44100 }, { "48", 48000 } };
28 int hb_audio_rates_count = sizeof( hb_audio_rates ) /
30 int hb_audio_rates_default = 3; /* 44100 Hz */
32 hb_rate_t hb_audio_bitrates[] =
33 { { "32", 32 }, { "40", 40 }, { "48", 48 }, { "56", 56 },
34 { "64", 64 }, { "80", 80 }, { "96", 96 }, { "112", 112 },
35 { "128", 128 }, { "160", 160 }, { "192", 192 }, { "224", 224 },
36 { "256", 256 }, { "320", 320 }, { "384", 384 }, { "448", 448 },
37 { "512", 512 }, { "576", 576 }, { "640", 640 }, { "768", 768 } };
38 int hb_audio_bitrates_count = sizeof( hb_audio_bitrates ) /
41 static hb_error_handler_t *error_handler = NULL;
43 hb_mixdown_t hb_audio_mixdowns[] =
44 { { "Mono", "HB_AMIXDOWN_MONO", "mono", HB_AMIXDOWN_MONO },
45 { "Stereo", "HB_AMIXDOWN_STEREO", "stereo", HB_AMIXDOWN_STEREO },
46 { "Dolby Surround", "HB_AMIXDOWN_DOLBY", "dpl1", HB_AMIXDOWN_DOLBY },
47 { "Dolby Pro Logic II", "HB_AMIXDOWN_DOLBYPLII", "dpl2", HB_AMIXDOWN_DOLBYPLII },
48 { "6-channel discrete", "HB_AMIXDOWN_6CH", "6ch", HB_AMIXDOWN_6CH }
50 int hb_audio_mixdowns_count = sizeof( hb_audio_mixdowns ) /
51 sizeof( hb_mixdown_t );
53 int hb_mixdown_get_mixdown_from_short_name( const char * short_name )
56 for (i = 0; i < hb_audio_mixdowns_count; i++)
58 if (strcmp(hb_audio_mixdowns[i].short_name, short_name) == 0)
60 return hb_audio_mixdowns[i].amixdown;
66 const char * hb_mixdown_get_short_name_from_mixdown( int amixdown )
69 for (i = 0; i < hb_audio_mixdowns_count; i++)
71 if (hb_audio_mixdowns[i].amixdown == amixdown)
73 return hb_audio_mixdowns[i].short_name;
79 // Given an input bitrate, find closest match in the set of allowed bitrates
80 int hb_find_closest_audio_bitrate(int bitrate)
85 // result is highest rate if none found during search.
86 // rate returned will always be <= rate asked for.
87 result = hb_audio_bitrates[0].rate;
88 for (ii = hb_audio_bitrates_count-1; ii >= 0; ii--)
90 if (bitrate >= hb_audio_bitrates[ii].rate)
92 result = hb_audio_bitrates[ii].rate;
99 // Get the bitrate low and high limits for a codec/samplerate/mixdown triplet
100 // The limits have been empirically determined through testing. Max bitrates
101 // in table below. Numbers in parenthesis are the target bitrate chosen.
103 Encoder 1 channel 2 channels 6 channels
106 24kHz 86 (128) 173 (256) 460 (768)
107 48kHz 152 (160) 304 (320) 759 (768)
110 24kHz 97 (80) 177 (160) 527 (512)
111 48kHz 241 (224) 465 (448) 783 (768)
114 24kHz 146 (768) 138 (768)
115 48kHz 318 (768) 318 (768)
118 24kHz 318 (320) 318 (320) 318 (320)
119 48kHz 636 (640) 636 (640) 636 (640)
121 Core Audio (core audio api provides range of allowed bitrates)
122 24kHz 16-64 32-128 80-320
123 44.1kHz 64-320 160-768
124 48kHz 32-256 64-320 160-768
126 Core Audio (minimum limits found in testing)
132 void hb_get_audio_bitrate_limits(uint32_t codec, int samplerate, int mixdown, int *low, int *high)
136 channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mixdown);
140 *low = 32 * channels;
141 if (samplerate > 24000)
151 case HB_ACODEC_CA_AAC:
152 if (samplerate > 44100)
154 *low = channels * 40;
163 else if (samplerate > 24000)
165 *low = channels * 32;
177 *low = channels * 16;
178 *high = channels * 64;
187 *low = 32 * channels;
188 if (samplerate > 24000)
190 *high = 160 * channels;
196 *high = 96 * channels;
202 case HB_ACODEC_VORBIS:
203 *high = channels * 80;
204 if (samplerate > 24000)
208 // Vorbis minimum is around 30kbps/ch for 6ch
209 // at rates > 24k (32k/44.1k/48k)
210 *low = 32 * channels;
211 *high = 128 * channels;
215 // Allow 24kbps mono and 48kbps stereo at rates > 24k
217 *low = 24 * channels;
218 if (samplerate > 32000)
219 *high = channels * 224;
221 *high = channels * 160;
226 *low = channels * 16;
227 *high = 80 * channels;
232 *low = hb_audio_bitrates[0].rate;
233 if (samplerate > 24000)
240 *low = hb_audio_bitrates[0].rate;
241 *high = hb_audio_bitrates[hb_audio_bitrates_count-1].rate;
246 // Given an input bitrate, sanitize it. Check low and high limits and
247 // make sure it is in the set of allowed bitrates.
248 int hb_get_best_audio_bitrate( uint32_t codec, int bitrate, int samplerate, int mixdown)
252 hb_get_audio_bitrate_limits(codec, samplerate, mixdown, &low, &high);
257 bitrate = hb_find_closest_audio_bitrate(bitrate);
261 // Get the default bitrate for a given codec/samplerate/mixdown triplet.
262 int hb_get_default_audio_bitrate( uint32_t codec, int samplerate, int mixdown )
264 int bitrate, channels;
267 channels = HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(mixdown);
269 // Min bitrate is established such that we get good quality
270 // audio as a minimum.
271 sr_shift = (samplerate <= 24000) ? 1 : 0;
278 else if (channels <= 2)
284 bitrate = channels * 80;
286 bitrate >>= sr_shift;
287 bitrate = hb_get_best_audio_bitrate( codec, bitrate, samplerate, mixdown );
291 int hb_get_best_mixdown( uint32_t codec, int layout, int mixdown )
296 if (codec & HB_ACODEC_PASS_FLAG)
298 // Audio pass-thru. No mixdown.
301 switch (layout & HB_INPUT_CH_LAYOUT_DISCRETE_NO_LFE_MASK)
303 // stereo input or something not handled below
305 case HB_INPUT_CH_LAYOUT_STEREO:
306 // mono gets mixed up to stereo & more than stereo gets mixed down
307 best_mixdown = HB_AMIXDOWN_STEREO;
311 case HB_INPUT_CH_LAYOUT_MONO:
312 // everything else passes through
313 best_mixdown = HB_AMIXDOWN_MONO;
316 // dolby (DPL1 aka Dolby Surround = 4.0 matrix-encoded) input
317 // the A52 flags don't allow for a way to distinguish between DPL1 and
318 // DPL2 on a DVD so we always assume a DPL1 source for A52_DOLBY.
319 case HB_INPUT_CH_LAYOUT_DOLBY:
320 best_mixdown = HB_AMIXDOWN_DOLBY;
323 // 4 channel discrete
324 case HB_INPUT_CH_LAYOUT_2F2R:
325 case HB_INPUT_CH_LAYOUT_3F1R:
326 // a52dec and libdca can't upmix to 6ch,
327 // so we must downmix these.
328 best_mixdown = HB_AMIXDOWN_DOLBYPLII;
331 // 5, 6, 7, or 8 channel discrete
332 case HB_INPUT_CH_LAYOUT_4F2R:
333 case HB_INPUT_CH_LAYOUT_3F4R:
334 case HB_INPUT_CH_LAYOUT_3F2R:
335 if ( ! ( layout & HB_INPUT_CH_LAYOUT_HAS_LFE ) )
337 // we don't do 5 channel discrete so mixdown to DPLII
338 // a52dec and libdca can't upmix to 6ch,
339 // so we must downmix this.
340 best_mixdown = HB_AMIXDOWN_DOLBYPLII;
347 best_mixdown = HB_AMIXDOWN_DOLBYPLII;
351 best_mixdown = HB_AMIXDOWN_6CH;
357 // return the best that is not greater than the requested mixdown
358 // 0 means the caller requested the best available mixdown
359 if( best_mixdown > mixdown && mixdown != 0 )
360 best_mixdown = mixdown;
365 int hb_get_default_mixdown( uint32_t codec, int layout )
370 // the AC3 encoder defaults to the best mixdown up to 6-channel
372 mixdown = HB_AMIXDOWN_6CH;
374 // other encoders default to the best mixdown up to DPLII
376 mixdown = HB_AMIXDOWN_DOLBYPLII;
379 // return the best available mixdown up to the selected default
380 return hb_get_best_mixdown( codec, layout, mixdown );
383 /**********************************************************************
385 **********************************************************************
386 * Given a numerator (num) and a denominator (den), reduce them to an
387 * equivalent fraction and store the result in x and y.
388 *********************************************************************/
389 void hb_reduce( int *x, int *y, int num, int den )
391 // find the greatest common divisor of num & den by Euclid's algorithm
392 int n = num, d = den;
400 // at this point n is the gcd. if it's non-zero remove it from num
401 // and den. Otherwise just return the original values.
414 /**********************************************************************
416 **********************************************************************
417 * Given the output width (if HB_KEEP_WIDTH) or height
418 * (HB_KEEP_HEIGHT) and the current crop values, calculates the
419 * correct height or width in order to respect the DVD aspect ratio
420 *********************************************************************/
421 void hb_fix_aspect( hb_job_t * job, int keep )
423 hb_title_t * title = job->title;
429 /* don't do anything unless the title has complete size info */
430 if ( title->height == 0 || title->width == 0 || title->aspect == 0 )
432 hb_log( "hb_fix_aspect: incomplete info for title %d: "
433 "height = %d, width = %d, aspect = %.3f",
434 title->index, title->height, title->width, title->aspect );
438 // min_width and min_height should be multiples of modulus
441 modulus = job->modulus ? job->modulus : 16;
443 for( i = 0; i < 4; i++ )
445 // Sanity check crop values are zero or positive multiples of 2
449 job->crop[i] = MIN( EVEN( job->crop[i] ), EVEN( ( title->height / 2 ) - ( min_height / 2 ) ) );
450 job->crop[i] = MAX( 0, job->crop[i] );
455 job->crop[i] = MIN( EVEN( job->crop[i] ), EVEN( ( title->width / 2 ) - ( min_width / 2 ) ) );
456 job->crop[i] = MAX( 0, job->crop[i] );
460 double par = (double)title->width / ( (double)title->height * title->aspect );
461 double cropped_sar = (double)( title->height - job->crop[0] - job->crop[1] ) /
462 (double)( title->width - job->crop[2] - job->crop[3] );
463 double ar = par * cropped_sar;
465 // Dimensions must be greater than minimum and multiple of modulus
466 if( keep == HB_KEEP_WIDTH )
468 job->width = MULTIPLE_MOD( job->width, modulus );
469 job->width = MAX( min_width, job->width );
470 job->height = MULTIPLE_MOD( (uint64_t)( (double)job->width * ar ), modulus );
471 job->height = MAX( min_height, job->height );
475 job->height = MULTIPLE_MOD( job->height, modulus );
476 job->height = MAX( min_height, job->height );
477 job->width = MULTIPLE_MOD( (uint64_t)( (double)job->height / ar ), modulus );
478 job->width = MAX( min_width, job->width );
482 /**********************************************************************
484 **********************************************************************
486 *********************************************************************/
487 int hb_calc_bitrate( hb_job_t * job, int size )
489 int64_t avail = (int64_t) size * 1024 * 1024;
492 int samples_per_frame;
495 hb_title_t * title = job->title;
496 hb_chapter_t * chapter;
499 /* How many overhead bytes are used for each frame
511 /* Get the duration in seconds */
513 for( i = job->chapter_start; i <= job->chapter_end; i++ )
515 chapter = hb_list_item( title->list_chapter, i - 1 );
516 length += chapter->duration;
523 hb_interjob_t * interjob = hb_interjob_get( job->h );
524 avail = job->vbitrate * 125 * length;
525 avail += length * interjob->vrate * overhead / interjob->vrate_base;
529 avail -= length * job->vrate * overhead / job->vrate_base;
536 for( i = 0; i < hb_list_count(job->list_audio); i++ )
540 audio = hb_list_item( job->list_audio, i);
542 /* How many audio samples we put in each frame */
543 switch( audio->config.out.codec )
546 case HB_ACODEC_CA_AAC:
547 case HB_ACODEC_VORBIS:
548 samples_per_frame = 1024;
551 samples_per_frame = 1152;
553 case HB_ACODEC_AC3_PASS:
554 case HB_ACODEC_DCA_PASS:
557 samples_per_frame = 1536;
563 if( audio->config.out.codec == HB_ACODEC_AC3_PASS ||
564 audio->config.out.codec == HB_ACODEC_DCA_PASS)
567 * For pass through we take the bitrate from the input audio
568 * bitrate as we are simply passing it through.
570 abitrate = audio->config.in.bitrate / 8;
575 * Where we are transcoding the audio we use the destination
578 abitrate = audio->config.out.bitrate * 1000 / 8;
580 avail -= length * abitrate;
583 avail -= length * audio->config.out.samplerate * overhead / samples_per_frame;
592 return ( avail / ( 125 * length ) );
595 /**********************************************************************
596 * hb_list implementation
597 **********************************************************************
598 * Basic and slow, but enough for what we need
599 *********************************************************************/
601 #define HB_LIST_DEFAULT_SIZE 20
605 /* Pointers to items in the list */
608 /* How many (void *) allocated in 'items' */
611 /* How many valid pointers in 'items' */
615 /**********************************************************************
617 **********************************************************************
618 * Allocates an empty list ready for HB_LIST_DEFAULT_SIZE items
619 *********************************************************************/
620 hb_list_t * hb_list_init()
624 l = calloc( sizeof( hb_list_t ), 1 );
625 l->items = calloc( HB_LIST_DEFAULT_SIZE * sizeof( void * ), 1 );
626 l->items_alloc = HB_LIST_DEFAULT_SIZE;
631 /**********************************************************************
633 **********************************************************************
634 * Returns the number of items currently in the list
635 *********************************************************************/
636 int hb_list_count( hb_list_t * l )
638 return l->items_count;
641 /**********************************************************************
643 **********************************************************************
644 * Adds an item at the end of the list, making it bigger if necessary.
645 * Can safely be called with a NULL pointer to add, it will be ignored.
646 *********************************************************************/
647 void hb_list_add( hb_list_t * l, void * p )
654 if( l->items_count == l->items_alloc )
656 /* We need a bigger boat */
657 l->items_alloc += HB_LIST_DEFAULT_SIZE;
658 l->items = realloc( l->items,
659 l->items_alloc * sizeof( void * ) );
662 l->items[l->items_count] = p;
666 /**********************************************************************
668 **********************************************************************
669 * Remove an item from the list. Bad things will happen if called
670 * with a NULL pointer or if the item is not in the list.
671 *********************************************************************/
672 void hb_list_rem( hb_list_t * l, void * p )
676 /* Find the item in the list */
677 for( i = 0; i < l->items_count; i++ )
679 if( l->items[i] == p )
685 /* Shift all items after it sizeof( void * ) bytes earlier */
686 memmove( &l->items[i], &l->items[i+1],
687 ( l->items_count - i - 1 ) * sizeof( void * ) );
692 /**********************************************************************
694 **********************************************************************
695 * Returns item at position i, or NULL if there are not that many
697 *********************************************************************/
698 void * hb_list_item( hb_list_t * l, int i )
700 if( i < 0 || i >= l->items_count )
708 /**********************************************************************
710 **********************************************************************
711 * Assuming all items are of type hb_buffer_t, returns the total
712 * number of bytes in the list
713 *********************************************************************/
714 int hb_list_bytes( hb_list_t * l )
721 for( i = 0; i < hb_list_count( l ); i++ )
723 buf = hb_list_item( l, i );
724 ret += buf->size - buf->cur;
730 /**********************************************************************
732 **********************************************************************
733 * Assuming all items are of type hb_buffer_t, copy <size> bytes from
734 * the list to <dst>, keeping the list unmodified.
735 *********************************************************************/
736 void hb_list_seebytes( hb_list_t * l, uint8_t * dst, int size )
743 for( i = 0, copied = 0; copied < size; i++ )
745 buf = hb_list_item( l, i );
746 copying = MIN( buf->size - buf->cur, size - copied );
747 memcpy( &dst[copied], &buf->data[buf->cur], copying );
752 /**********************************************************************
754 **********************************************************************
755 * Assuming all items are of type hb_buffer_t, copy <size> bytes from
756 * the list to <dst>. What's copied is removed from the list.
757 * The variable pointed by <pts> is set to the PTS of the buffer the
758 * first byte has been got from.
759 * The variable pointed by <pos> is set to the position of that byte
761 *********************************************************************/
762 void hb_list_getbytes( hb_list_t * l, uint8_t * dst, int size,
763 uint64_t * pts, uint64_t * pos )
770 /* So we won't have to deal with NULL pointers */
771 uint64_t dummy1, dummy2;
773 if( !pts ) pts = &dummy1;
774 if( !pos ) pos = &dummy2;
776 for( copied = 0, has_pts = 0; copied < size; )
778 buf = hb_list_item( l, 0 );
779 copying = MIN( buf->size - buf->cur, size - copied );
780 memcpy( &dst[copied], &buf->data[buf->cur], copying );
790 if( buf->cur >= buf->size )
792 hb_list_rem( l, buf );
793 hb_buffer_close( &buf );
800 /**********************************************************************
802 **********************************************************************
803 * Assuming all items are of type hb_buffer_t, close them all and
805 *********************************************************************/
806 void hb_list_empty( hb_list_t ** _l )
811 while( ( b = hb_list_item( l, 0 ) ) )
814 hb_buffer_close( &b );
820 /**********************************************************************
822 **********************************************************************
823 * Free memory allocated by hb_list_init. Does NOT free contents of
824 * items still in the list.
825 *********************************************************************/
826 void hb_list_close( hb_list_t ** _l )
836 /**********************************************************************
838 **********************************************************************
839 * If verbose mode is one, print message with timestamp. Messages
840 * longer than 180 characters are stripped ;p
841 *********************************************************************/
842 void hb_log( char * log, ... )
844 char string[362]; /* 360 chars + \n + \0 */
849 if( !getenv( "HB_DEBUG" ) )
851 /* We don't want to print it */
857 now = localtime( &_now );
858 sprintf( string, "[%02d:%02d:%02d] ",
859 now->tm_hour, now->tm_min, now->tm_sec );
861 /* Convert the message to a string */
862 va_start( args, log );
863 vsnprintf( string + 11, 349, log, args );
866 /* Add the end of line */
867 strcat( string, "\n" );
870 fprintf( stderr, "%s", string );
873 int global_verbosity_level; //Necessary for hb_deep_log
874 /**********************************************************************
876 **********************************************************************
877 * If verbose mode is >= level, print message with timestamp. Messages
878 * longer than 360 characters are stripped ;p
879 *********************************************************************/
880 void hb_deep_log( hb_debug_level_t level, char * log, ... )
882 char string[362]; /* 360 chars + \n + \0 */
887 if( global_verbosity_level < level )
895 now = localtime( &_now );
896 sprintf( string, "[%02d:%02d:%02d] ",
897 now->tm_hour, now->tm_min, now->tm_sec );
899 /* Convert the message to a string */
900 va_start( args, log );
901 vsnprintf( string + 11, 349, log, args );
904 /* Add the end of line */
905 strcat( string, "\n" );
908 fprintf( stderr, "%s", string );
911 /**********************************************************************
913 **********************************************************************
914 * Using whatever output is available display this error.
915 *********************************************************************/
916 void hb_error( char * log, ... )
918 char string[181]; /* 180 chars + \0 */
919 char rep_string[181];
920 static char last_string[181];
921 static int last_error_count = 0;
922 static uint64_t last_series_error_time = 0;
923 static hb_lock_t *mutex = 0;
927 /* Convert the message to a string */
928 va_start( args, log );
929 vsnprintf( string, 180, log, args );
934 mutex = hb_lock_init();
939 time_now = hb_get_date();
941 if( strcmp( string, last_string) == 0 )
944 * The last error and this one are the same, don't log it
945 * just count it instead, unless it was more than one second
949 if( last_series_error_time + ( 1000 * 1 ) > time_now )
957 * A new error, or the same one more than 10sec since the last one
958 * did we have any of the same counted up?
960 if( last_error_count > 0 )
963 * Print out the last error to ensure context for the last
968 error_handler( last_string );
970 hb_log( "%s", last_string );
973 if( last_error_count > 1 )
976 * Only print out the repeat message for more than 2 of the
977 * same, since we just printed out two of them already.
979 snprintf( rep_string, 180, "Last error repeated %d times",
980 last_error_count - 1 );
984 error_handler( rep_string );
986 hb_log( "%s", rep_string );
990 last_error_count = 0;
993 last_series_error_time = time_now;
995 strcpy( last_string, string );
998 * Got the error in a single string, send it off to be dispatched.
1002 error_handler( string );
1004 hb_log( "%s", string );
1010 void hb_register_error_handler( hb_error_handler_t * handler )
1012 error_handler = handler;
1015 /**********************************************************************
1017 **********************************************************************
1019 *********************************************************************/
1020 hb_title_t * hb_title_init( char * path, int index )
1024 t = calloc( sizeof( hb_title_t ), 1 );
1027 t->list_audio = hb_list_init();
1028 t->list_chapter = hb_list_init();
1029 t->list_subtitle = hb_list_init();
1030 t->list_attachment = hb_list_init();
1031 strcat( t->path, path );
1032 // default to decoding mpeg2
1034 t->video_codec = WORK_DECMPEG2;
1040 /**********************************************************************
1042 **********************************************************************
1044 *********************************************************************/
1045 void hb_title_close( hb_title_t ** _t )
1047 hb_title_t * t = *_t;
1049 hb_chapter_t * chapter;
1050 hb_subtitle_t * subtitle;
1051 hb_attachment_t * attachment;
1053 while( ( audio = hb_list_item( t->list_audio, 0 ) ) )
1055 if ( audio->priv.ff_audio_list != NULL )
1057 hb_list_close( &audio->priv.ff_audio_list );
1059 hb_list_rem( t->list_audio, audio );
1062 hb_list_close( &t->list_audio );
1064 while( ( chapter = hb_list_item( t->list_chapter, 0 ) ) )
1066 hb_list_rem( t->list_chapter, chapter );
1069 hb_list_close( &t->list_chapter );
1071 while( ( subtitle = hb_list_item( t->list_subtitle, 0 ) ) )
1073 hb_list_rem( t->list_subtitle, subtitle );
1074 if ( subtitle->extradata )
1076 free( subtitle->extradata );
1077 subtitle->extradata = NULL;
1081 hb_list_close( &t->list_subtitle );
1083 while( ( attachment = hb_list_item( t->list_attachment, 0 ) ) )
1085 hb_list_rem( t->list_attachment, attachment );
1086 if ( attachment->name )
1088 free( attachment->name );
1089 attachment->name = NULL;
1091 if ( attachment->data )
1093 free( attachment->data );
1094 attachment->data = NULL;
1098 hb_list_close( &t->list_attachment );
1102 if( t->metadata->coverart )
1104 free( t->metadata->coverart );
1106 free( t->metadata );
1113 /**********************************************************************
1115 **********************************************************************
1117 *********************************************************************/
1118 void hb_filter_close( hb_filter_object_t ** _f )
1120 hb_filter_object_t * f = *_f;
1122 f->close( f->private_data );
1127 free( f->settings );
1133 /**********************************************************************
1135 **********************************************************************
1137 *********************************************************************/
1138 hb_audio_t *hb_audio_copy(const hb_audio_t *src)
1140 hb_audio_t *audio = NULL;
1144 audio = calloc(1, sizeof(*audio));
1145 memcpy(audio, src, sizeof(*audio));
1150 /**********************************************************************
1152 **********************************************************************
1154 *********************************************************************/
1155 void hb_audio_config_init(hb_audio_config_t * audiocfg)
1157 /* Set read only paramaters to invalid values */
1158 audiocfg->in.codec = 0xDEADBEEF;
1159 audiocfg->in.bitrate = -1;
1160 audiocfg->in.samplerate = -1;
1161 audiocfg->in.channel_layout = 0;
1162 audiocfg->in.version = 0;
1163 audiocfg->in.mode = 0;
1164 audiocfg->flags.ac3 = 0;
1165 audiocfg->lang.description[0] = 0;
1166 audiocfg->lang.simple[0] = 0;
1167 audiocfg->lang.iso639_2[0] = 0;
1169 /* Initalize some sensable defaults */
1170 audiocfg->in.track = audiocfg->out.track = 0;
1171 audiocfg->out.codec = HB_ACODEC_FAAC;
1172 audiocfg->out.bitrate = 128;
1173 audiocfg->out.samplerate = 44100;
1174 audiocfg->out.mixdown = HB_AMIXDOWN_DOLBYPLII;
1175 audiocfg->out.dynamic_range_compression = 0;
1176 audiocfg->out.name = NULL;
1179 /**********************************************************************
1181 **********************************************************************
1183 *********************************************************************/
1184 int hb_audio_add(const hb_job_t * job, const hb_audio_config_t * audiocfg)
1186 hb_title_t *title = job->title;
1189 audio = hb_audio_copy( hb_list_item( title->list_audio, audiocfg->in.track ) );
1196 if( (audiocfg->in.bitrate != -1) && (audiocfg->in.codec != 0xDEADBEEF) )
1198 /* This most likely means the client didn't call hb_audio_config_init
1204 /* Really shouldn't ignore the passed out track, but there is currently no
1205 * way to handle duplicates or out-of-order track numbers.
1207 audio->config.out.track = hb_list_count(job->list_audio) + 1;
1208 audio->config.out.codec = audiocfg->out.codec;
1209 if( (audiocfg->out.codec & HB_ACODEC_MASK) == audio->config.in.codec &&
1210 (audiocfg->out.codec & HB_ACODEC_PASS_FLAG ) )
1212 /* Pass-through, copy from input. */
1213 audio->config.out.samplerate = audio->config.in.samplerate;
1214 audio->config.out.bitrate = audio->config.in.bitrate;
1215 audio->config.out.dynamic_range_compression = 0;
1216 audio->config.out.mixdown = 0;
1220 /* Non pass-through, use what is given. */
1221 audio->config.out.codec &= ~HB_ACODEC_PASS_FLAG;
1222 audio->config.out.samplerate = audiocfg->out.samplerate;
1223 audio->config.out.bitrate = audiocfg->out.bitrate;
1224 audio->config.out.dynamic_range_compression = audiocfg->out.dynamic_range_compression;
1225 audio->config.out.mixdown = audiocfg->out.mixdown;
1228 hb_list_add(job->list_audio, audio);
1232 hb_audio_config_t * hb_list_audio_config_item(hb_list_t * list, int i)
1234 hb_audio_t *audio = NULL;
1236 if( (audio = hb_list_item(list, i)) )
1237 return &(audio->config);
1242 /**********************************************************************
1244 **********************************************************************
1246 *********************************************************************/
1247 hb_subtitle_t *hb_subtitle_copy(const hb_subtitle_t *src)
1249 hb_subtitle_t *subtitle = NULL;
1253 subtitle = calloc(1, sizeof(*subtitle));
1254 memcpy(subtitle, src, sizeof(*subtitle));
1255 if ( src->extradata )
1257 subtitle->extradata = malloc( src->extradata_size );
1258 memcpy( subtitle->extradata, src->extradata, src->extradata_size );
1264 /**********************************************************************
1266 **********************************************************************
1268 *********************************************************************/
1269 int hb_subtitle_add(const hb_job_t * job, const hb_subtitle_config_t * subtitlecfg, int track)
1271 hb_title_t *title = job->title;
1272 hb_subtitle_t *subtitle;
1274 subtitle = hb_subtitle_copy( hb_list_item( title->list_subtitle, track ) );
1275 if( subtitle == NULL )
1280 subtitle->config = *subtitlecfg;
1281 hb_list_add(job->list_subtitle, subtitle);
1285 int hb_srt_add( const hb_job_t * job,
1286 const hb_subtitle_config_t * subtitlecfg,
1289 hb_subtitle_t *subtitle;
1290 iso639_lang_t *language = NULL;
1293 subtitle = calloc( 1, sizeof( *subtitle ) );
1295 subtitle->id = (hb_list_count(job->list_subtitle) << 8) | 0xFF;
1296 subtitle->format = TEXTSUB;
1297 subtitle->source = SRTSUB;
1299 language = lang_for_code2( lang );
1304 strcpy( subtitle->lang, language->eng_name );
1305 strncpy( subtitle->iso639_2, lang, 4 );
1307 subtitle->config = *subtitlecfg;
1308 subtitle->config.dest = PASSTHRUSUB;
1310 hb_list_add(job->list_subtitle, subtitle);
1316 char * hb_strdup_printf( char * fmt, ... )
1324 str = malloc( size );
1330 /* Try to print in the allocated space. */
1331 va_start( ap, fmt );
1332 len = vsnprintf( str, size, fmt, ap );
1335 /* If that worked, return the string. */
1336 if ( len > -1 && len < size )
1341 /* Else try again with more space. */
1342 if ( len > -1 ) /* glibc 2.1 */
1343 size = len + 1; /* precisely what is needed */
1344 else /* glibc 2.0 */
1345 size *= 2; /* twice the old size */
1346 tmp = realloc( str, size );
1357 /**********************************************************************
1358 * hb_attachment_copy
1359 **********************************************************************
1361 *********************************************************************/
1362 hb_attachment_t *hb_attachment_copy(const hb_attachment_t *src)
1364 hb_attachment_t *attachment = NULL;
1368 attachment = calloc(1, sizeof(*attachment));
1369 memcpy(attachment, src, sizeof(*attachment));
1372 attachment->name = strdup( src->name );
1376 attachment->data = malloc( src->size );
1377 memcpy( attachment->data, src->data, src->size );
1383 /**********************************************************************
1385 **********************************************************************
1386 * Converts a YCbCr pixel to an RGB pixel.
1388 * This conversion is lossy (due to rounding and clamping).
1391 * http://en.wikipedia.org/w/index.php?title=YCbCr&oldid=361987695#Technical_details
1392 *********************************************************************/
1393 int hb_yuv2rgb(int yuv)
1398 y = (yuv >> 16) & 0xff;
1399 Cb = (yuv >> 8) & 0xff;
1402 r = 1.164 * (y - 16) + 2.018 * (Cb - 128);
1403 g = 1.164 * (y - 16) - 0.813 * (Cr - 128) - 0.391 * (Cb - 128);
1404 b = 1.164 * (y - 16) + 1.596 * (Cr - 128);
1406 r = (r < 0) ? 0 : r;
1407 g = (g < 0) ? 0 : g;
1408 b = (b < 0) ? 0 : b;
1410 r = (r > 255) ? 255 : r;
1411 g = (g > 255) ? 255 : g;
1412 b = (b > 255) ? 255 : b;
1414 return (r << 16) | (g << 8) | b;
1417 /**********************************************************************
1419 **********************************************************************
1420 * Converts an RGB pixel to a YCbCr pixel.
1422 * This conversion is lossy (due to rounding and clamping).
1425 * http://en.wikipedia.org/w/index.php?title=YCbCr&oldid=361987695#Technical_details
1426 *********************************************************************/
1427 int hb_rgb2yuv(int rgb)
1432 r = (rgb >> 16) & 0xff;
1433 g = (rgb >> 8) & 0xff;
1436 y = 16. + ( 0.257 * r) + (0.504 * g) + (0.098 * b);
1437 Cb = 128. + (-0.148 * r) - (0.291 * g) + (0.439 * b);
1438 Cr = 128. + ( 0.439 * r) - (0.368 * g) - (0.071 * b);
1440 y = (y < 0) ? 0 : y;
1441 Cb = (Cb < 0) ? 0 : Cb;
1442 Cr = (Cr < 0) ? 0 : Cr;
1444 y = (y > 255) ? 255 : y;
1445 Cb = (Cb > 255) ? 255 : Cb;
1446 Cr = (Cr > 255) ? 255 : Cr;
1448 return (y << 16) | (Cb << 8) | Cr;
1451 const char * hb_subsource_name( int source )