From f3ecb9ed626cda7181aae826f5f56602ff749932 Mon Sep 17 00:00:00 2001 From: saintdev Date: Thu, 26 Apr 2007 07:57:59 +0000 Subject: [PATCH] Various fixes: - Include parsecsv.c in the Jamfile so we can compile the CLI with Jam - Quiet some compiler warnings in parsecsv.{c,h} - Check some return values in muxmp4.c and encfaac.c and die gracefully if there is a problem. - Correctly set the number of audio channels in the stsd atom. git-svn-id: svn://localhost/HandBrake/trunk@552 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- Jamfile | 3 ++- contrib/patch-mpeg4ip.patch | 23 +++++++++++++++++++ libhb/encfaac.c | 4 ++++ libhb/muxmp4.c | 54 ++++++++++++++++++++++++++++++++++++++++----- test/parsecsv.c | 3 +-- test/parsecsv.h | 2 +- 6 files changed, 80 insertions(+), 9 deletions(-) diff --git a/Jamfile b/Jamfile index c068d540..b0a21995 100644 --- a/Jamfile +++ b/Jamfile @@ -29,7 +29,8 @@ if $(OS) != CYGWIN # Interfaces CLI_BIN = HandBrakeCLI ; -CLI_SRC = test/test.c ; +CLI_SRC = test/test.c + test/parsecsv.c ; BEOS_BIN = HandBrake ; BEOS_SRC = beos/HBApp.cpp beos/MainWindow.cpp beos/ScanWindow.cpp beos/PicWindow.cpp beos/Stepper.cpp beos/QueueWindow.cpp ; diff --git a/contrib/patch-mpeg4ip.patch b/contrib/patch-mpeg4ip.patch index d025e575..8a5462c5 100644 --- a/contrib/patch-mpeg4ip.patch +++ b/contrib/patch-mpeg4ip.patch @@ -600,3 +600,26 @@ diff -Naur mpeg4ip.orig/lib/mp4v2/mp4file.h mpeg4ip.patched/lib/mp4v2/mp4file.h MP4SampleId GetTrackNumberOfSamples(MP4TrackId trackId); +diff -Naur mpeg4ip.orig/lib/mp4v2/atom_mp4a.cpp mpeg4ip.patched/lib/mp4v2/atom_mp4a.cpp +--- mpeg4ip.orig/lib/mp4v2/atom_mp4a.cpp 2007-04-26 01:21:22.000000000 -0600 ++++ mpeg4ip.patched/lib/mp4v2/atom_mp4a.cpp 2007-04-26 01:43:08.000000000 -0600 +@@ -29,7 +29,10 @@ + AddProperty( /* 1 */ + new MP4Integer16Property("dataReferenceIndex")); + +- AddReserved("reserved2", 16); /* 2 */ ++ /* patched by saintdev to allow us to set correct audio information */ ++// AddReserved("reserved2", 16); /* 2 */ ++ AddProperty( /* 2 */ ++ new MP4BytesProperty("reserved2", 16)); + + AddProperty( /* 3 */ + new MP4Integer16Property("timeScale")); +@@ -55,5 +58,6 @@ + m_pProperties[2]->SetReadOnly(false); + ((MP4BytesProperty*)m_pProperties[2])-> + SetValue(reserved2, sizeof(reserved2)); +- m_pProperties[2]->SetReadOnly(true); ++ /* patched by saintdev to allow us to set correct audio information */ ++// m_pProperties[2]->SetReadOnly(true); + } diff --git a/libhb/encfaac.c b/libhb/encfaac.c index d46e8aed..95a047ac 100644 --- a/libhb/encfaac.c +++ b/libhb/encfaac.c @@ -95,11 +95,15 @@ int encfaacInit( hb_work_object_t * w, hb_job_t * job ) if( !faacEncSetConfiguration( pv->faac, cfg ) ) { hb_log( "faacEncSetConfiguration failed" ); + *job->die = 1; + return 0; } if( faacEncGetDecoderSpecificInfo( pv->faac, &bytes, &length ) < 0 ) { hb_log( "faacEncGetDecoderSpecificInfo failed" ); + *job->die = 1; + return 0; } memcpy( w->config->aac.bytes, bytes, length ); w->config->aac.length = length; diff --git a/libhb/muxmp4.c b/libhb/muxmp4.c index e2de1ce8..284c4ce6 100644 --- a/libhb/muxmp4.c +++ b/libhb/muxmp4.c @@ -140,6 +140,12 @@ static int MP4Init( hb_mux_object_t * m ) /* Create an empty mp4 file */ m->file = MP4Create( job->file, MP4_DETAILS_ERROR, 0 ); + if (m->file == MP4_INVALID_FILE_HANDLE) + { + hb_log("muxmp4.c: MP4Create failed!"); + *job->die = 1; + return 0; + } /* Video track */ mux_data = malloc( sizeof( hb_mux_data_t ) ); @@ -149,12 +155,22 @@ static int MP4Init( hb_mux_object_t * m ) synchronization issues (audio not playing at the correct speed). To workaround this, we use the audio samplerate as the timescale */ - MP4SetTimeScale( m->file, job->arate ); + if (!(MP4SetTimeScale( m->file, job->arate ))) + { + hb_log("muxmp4.c: MP4SetTimeScale failed!"); + *job->die = 1; + return 0; + } if( job->vcodec == HB_VCODEC_X264 ) { /* Stolen from mp4creator */ - MP4SetVideoProfileLevel( m->file, 0x7F ); + if(!(MP4SetVideoProfileLevel( m->file, 0x7F ))) + { + hb_log("muxmp4.c: MP4SetVideoProfileLevel failed!"); + *job->die = 1; + return 0; + } mux_data->track = MP4AddH264VideoTrack( m->file, job->arate, MP4_INVALID_DURATION, job->width, job->height, @@ -178,14 +194,31 @@ static int MP4Init( hb_mux_object_t * m ) } else /* FFmpeg or XviD */ { - MP4SetVideoProfileLevel( m->file, MPEG4_SP_L3 ); + if(!(MP4SetVideoProfileLevel( m->file, MPEG4_SP_L3 ))) + { + hb_log("muxmp4.c: MP4SetVideoProfileLevel failed!"); + *job->die = 1; + return 0; + } mux_data->track = MP4AddVideoTrack( m->file, job->arate, MP4_INVALID_DURATION, job->width, job->height, MP4_MPEG4_VIDEO_TYPE ); + if (mux_data->track == MP4_INVALID_TRACK_ID) + { + hb_log("muxmp4.c: MP4AddVideoTrack failed!"); + *job->die = 1; + return 0; + } + /* VOL from FFmpeg or XviD */ - MP4SetTrackESConfiguration( m->file, mux_data->track, - job->config.mpeg4.bytes, job->config.mpeg4.length ); + if (!(MP4SetTrackESConfiguration( m->file, mux_data->track, + job->config.mpeg4.bytes, job->config.mpeg4.length ))) + { + hb_log("muxmp4.c: MP4SetTrackESConfiguration failed!"); + *job->die = 1; + return 0; + } } /* apply the anamorphic transformation matrix if needed */ @@ -235,6 +268,13 @@ static int MP4Init( hb_mux_object_t * m ) /* add the audio tracks */ for( i = 0; i < hb_list_count( title->list_audio ); i++ ) { + static u_int8_t reserved2[16] = { + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, + 0x00, 0x02, 0x00, 0x10, + 0x00, 0x00, 0x00, 0x00, + }; + audio = hb_list_item( title->list_audio, i ); mux_data = malloc( sizeof( hb_mux_data_t ) ); audio->mux_data = mux_data; @@ -251,6 +291,10 @@ static int MP4Init( hb_mux_object_t * m ) language_code |= audio->iso639_2[1] - 0x60; language_code <<= 5; language_code |= audio->iso639_2[2] - 0x60; MP4SetTrackIntegerProperty(m->file, mux_data->track, "mdia.mdhd.language", language_code); + + /* Set the correct number of channels for this track */ + reserved2[9] = (u_int8_t)HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->amixdown); + MP4SetTrackBytesProperty(m->file, mux_data->track, "mdia.minf.stbl.stsd.mp4a.reserved2", reserved2, sizeof(reserved2)); /* store a reference to the first audio track, so we can use it to feed the chapter text track's sample rate */ diff --git a/test/parsecsv.c b/test/parsecsv.c index f0a8a1a1..bfc6a278 100644 --- a/test/parsecsv.c +++ b/test/parsecsv.c @@ -140,7 +140,6 @@ static uint16_t hb_parse_character( hb_csv_file_t * file ) { int byte; uint16_t c; - int read_result; int need_char = 1; if( file == NULL ) @@ -211,4 +210,4 @@ static void hb_trim_end( char *text ) { text[i] = '\0'; } -} \ No newline at end of file +} diff --git a/test/parsecsv.h b/test/parsecsv.h index 6247ddb4..f3e27a75 100644 --- a/test/parsecsv.h +++ b/test/parsecsv.h @@ -33,4 +33,4 @@ void hb_close_csv_file( hb_csv_file_t *file ); /* Parse CSV Cells */ hb_csv_cell_t *hb_read_next_cell( hb_csv_file_t *file ); -void hb_dispose_cell( hb_csv_cell_t *cell ); \ No newline at end of file +void hb_dispose_cell( hb_csv_cell_t *cell ); -- 2.11.0