* hb_log
**********************************************************************
* If verbose mode is one, print message with timestamp. Messages
- * longer than 80 characters are stripped ;p
+ * longer than 180 characters are stripped ;p
*********************************************************************/
void hb_log( char * log, ... )
{
}
/**********************************************************************
+ * hb_error
+ **********************************************************************
+ * Using whatever output is available display this error.
+ *********************************************************************/
+void hb_error( char * log, ... )
+{
+ char string[181]; /* 180 chars + \0 */
+ time_t _now;
+ struct tm * now;
+ va_list args;
+
+ extern void hb_error_handler(const char *errmsg);
+
+ /* Convert the message to a string */
+ va_start( args, log );
+ vsnprintf( string, 180, log, args );
+ va_end( args );
+
+ /*
+ * Got the error in a single string, send it off to be dispatched.
+ */
+ hb_error_handler(string);
+}
+
+/**********************************************************************
* hb_title_init
**********************************************************************
*
/* Open device */
if( !( d->reader = DVDOpen( path ) ) )
{
- hb_log( "dvd: DVDOpen failed (%s)", path );
+ hb_error( "dvd: DVDOpen failed (%s)", path );
goto fail;
}
/* Open main IFO */
if( !( d->vmg = ifoOpen( d->reader, 0 ) ) )
{
- hb_log( "dvd: ifoOpen failed" );
+ hb_error( "dvd: ifoOpen failed" );
goto fail;
}
hb_log( "scan: opening IFO for VTS %d", title->vts );
if( !( vts = ifoOpen( d->reader, title->vts ) ) )
{
- hb_log( "scan: ifoOpen failed" );
+ hb_error( "scan: ifoOpen failed" );
goto fail;
}
pgn = vts->vts_ptt_srpt->title[title->ttn-1].ptt[0].pgn;
d->pgc = vts->vts_pgcit->pgci_srp[pgc_id-1].pgc;
+ hb_log("pgc_id: %d, pgn: %d: pgc: 0x%x", pgc_id, pgn, d->pgc);
+
+ if( !d->pgc )
+ {
+ hb_error( "scan: pgc not valid, skipping" );
+ goto fail;
+ }
+
/* Start cell */
title->cell_start = d->pgc->program_map[pgn-1] - 1;
title->block_start = d->pgc->cell_playback[title->cell_start].first_sector;
d->ttn = d->vmg->tt_srpt->title[title-1].vts_ttn;
if( !( d->ifo = ifoOpen( d->reader, d->vts ) ) )
{
- hb_log( "dvd: ifoOpen failed for VTS %d", d->vts );
+ hb_error( "dvd: ifoOpen failed for VTS %d", d->vts );
return 0;
}
if( !( d->file = DVDOpenFile( d->reader, d->vts,
DVD_READ_TITLE_VOBS ) ) )
{
- hb_log( "dvd: DVDOpenFile failed for VTS %d", d->vts );
+ hb_error( "dvd: DVDOpenFile failed for VTS %d", d->vts );
return 0;
}
{
if( DVDReadBlocks( d->file, d->block, 1, b->data ) != 1 )
{
- hb_log( "reader: DVDReadBlocks failed (%d)", d->block );
+ hb_error( "reader: DVDReadBlocks failed (%d)", d->block );
return 0;
}
d->pack_len--;
* common.c
**********************************************************************/
void hb_log( char * log, ... );
+void hb_error( char * fmt, ...);
int hb_list_bytes( hb_list_t * );
void hb_list_seebytes( hb_list_t * l, uint8_t * dst, int size );
break;
default:
*job->die = 1;
- hb_log("muxmkv: Unknown video codec: %x", job->vcodec);
+ hb_error("muxmkv: Unknown video codec: %x", job->vcodec);
return 0;
}
break;
default:
*job->die = 1;
- hb_log("muxmkv: Unknown audio codec: %x", job->acodec);
+ hb_error("muxmkv: Unknown audio codec: %x", job->acodec);
return 0;
}
free(track->codecPrivate);
}
- mk_writeHeader( m->file, "HandBrake " HB_VERSION);
+ if( mk_writeHeader( m->file, "HandBrake " HB_VERSION) < 0 )
+ {
+ hb_error( "Failed to write to output file, disk full?");
+ *job->die = 1;
+ }
if (track != NULL)
free(track);
if (avcC != NULL)
}
}
- mk_startFrame(m->file, mux_data->track);
- mk_addFrameData(m->file, mux_data->track, buf->data, buf->size);
- mk_setFrameFlags(m->file, mux_data->track, timecode,
- ((job->vcodec == HB_VCODEC_X264 && mux_data == job->mux_data) ? (buf->frametype == HB_FRAME_IDR) : ((buf->frametype & HB_FRAME_KEY) != 0)) );
+ if( mk_startFrame(m->file, mux_data->track) < 0)
+ {
+ hb_error( "Failed to write start frame to output file, Disk Full?" );
+ *job->die = 1;
+ }
+ if( mk_addFrameData(m->file, mux_data->track, buf->data, buf->size) < 0 )
+ {
+ hb_error( "Failed to write frame data to output file, Disk Full?" );
+ *job->die = 1;
+ }
+ if( mk_setFrameFlags(m->file, mux_data->track, timecode,
+ ((job->vcodec == HB_VCODEC_X264 && mux_data == job->mux_data) ? (buf->frametype == HB_FRAME_IDR) : ((buf->frametype & HB_FRAME_KEY) != 0)) ) < 0 )
+ {
+ hb_error( "Failed to write frame flags to output file, Disk Full?" );
+ *job->die = 1;
+ }
return 0;
}
if (m->file == MP4_INVALID_FILE_HANDLE)
{
- hb_log("muxmp4.c: MP4Create failed!");
+ hb_error("muxmp4.c: MP4Create failed!");
*job->die = 1;
return 0;
}
timescale */
if (!(MP4SetTimeScale( m->file, job->arate )))
{
- hb_log("muxmp4.c: MP4SetTimeScale failed!");
+ hb_error("muxmp4.c: MP4SetTimeScale failed!");
*job->die = 1;
return 0;
}
/* Stolen from mp4creator */
if(!(MP4SetVideoProfileLevel( m->file, 0x7F )))
{
- hb_log("muxmp4.c: MP4SetVideoProfileLevel failed!");
+ hb_error("muxmp4.c: MP4SetVideoProfileLevel failed!");
*job->die = 1;
return 0;
}
{
if(!(MP4SetVideoProfileLevel( m->file, MPEG4_SP_L3 )))
{
- hb_log("muxmp4.c: MP4SetVideoProfileLevel failed!");
+ hb_error("muxmp4.c: MP4SetVideoProfileLevel failed!");
*job->die = 1;
return 0;
}
MP4_MPEG4_VIDEO_TYPE );
if (mux_data->track == MP4_INVALID_TRACK_ID)
{
- hb_log("muxmp4.c: MP4AddVideoTrack failed!");
+ hb_error("muxmp4.c: MP4AddVideoTrack failed!");
*job->die = 1;
return 0;
}
if (!(MP4SetTrackESConfiguration( m->file, mux_data->track,
job->config.mpeg4.bytes, job->config.mpeg4.length )))
{
- hb_log("muxmp4.c: MP4SetTrackESConfiguration failed!");
+ hb_error("muxmp4.c: MP4SetTrackESConfiguration failed!");
*job->die = 1;
return 0;
}
if( job->chapter_markers && buf->new_chap )
{
struct hb_text_sample_s *sample = MP4GenerateChapterSample( m, (m->sum_dur - m->chapter_duration) );
-
- MP4WriteSample(m->file, m->chapter_track, sample->sample, sample->length, sample->duration, 0, true);
+
+ if( !MP4WriteSample(m->file,
+ m->chapter_track,
+ sample->sample,
+ sample->length,
+ sample->duration,
+ 0, true) )
+ {
+ hb_error("Failed to write to output file, disk full?");
+ *job->die = 1;
+ }
free(sample);
m->current_chapter++;
m->chapter_duration = m->sum_dur;
If there are b-frames, offset by the initDelay plus the
difference between the presentation time stamp x264 gives
and the decoding time stamp from the buffer data. */
- MP4WriteSample( m->file, mux_data->track, buf->data, buf->size,
- duration, ((mux_data->track != 1) || (job->areBframes==0) || (job->vcodec != HB_VCODEC_X264)) ? 0 : ( buf->renderOffset * job->arate / 90000),
- ((buf->frametype & HB_FRAME_KEY) != 0) );
+ if( !MP4WriteSample( m->file,
+ mux_data->track,
+ buf->data,
+ buf->size,
+ duration,
+ ((mux_data->track != 1) ||
+ (job->areBframes==0) ||
+ (job->vcodec != HB_VCODEC_X264)) ? 0 : ( buf->renderOffset * job->arate / 90000),
+ ((buf->frametype & HB_FRAME_KEY) != 0) ) )
+ {
+ hb_error("Failed to write to output file, disk full?");
+ *job->die = 1;
+ }
return 0;
}
static int MP4End( hb_mux_object_t * m )
-{
+{
+ hb_job_t * job = m->job;
+
/* Write our final chapter marker */
if( m->job->chapter_markers )
{
struct hb_text_sample_s *sample = MP4GenerateChapterSample( m, (m->sum_dur - m->chapter_duration) );
- MP4WriteSample(m->file, m->chapter_track, sample->sample, sample->length, sample->duration, 0, true);
+ if( !MP4WriteSample(m->file,
+ m->chapter_track,
+ sample->sample,
+ sample->length,
+ sample->duration,
+ 0, true) )
+ {
+ hb_error("Failed to write to output file, disk full?");
+ *job->die = 1;
+ }
free(sample);
}
char filename[1024]; memset( filename, 0, 1024 );
#endif
- hb_job_t * job = m->job;
-
if (job->areBframes)
/* Walk the entire video sample table and find the minumum ctts value. */
{
[NSApp terminate: NULL];
}
+/****************************************************************************
+ * hb_error_handler
+ *
+ * Change this to display a dialog box - and maybe move it somewhere else,
+ * this is the only place I could find that looked like C :)
+****************************************************************************/
+extern "C" {
+void hb_error_handler( const char *errmsg )
+{
+ fprintf(stderr, "ERROR: %s\n", errmsg );
+}
+}
+
int main( int argc, const char ** argv )
{
signal( SIGINT, SigHandler );
return 0;
}
+/****************************************************************************
+ * hb_error_handler
+ *
+ * When using the CLI just display using hb_log as we always did in the past
+ * make sure that we prefix with a nice ERROR message to catch peoples eyes.
+ ****************************************************************************/
+void hb_error_handler ( const char *errmsg )
+{
+ hb_log( "ERROR: %s", errmsg );
+}