X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=libhb%2Fmuxmp4.c;h=bc523f836634c587c77f3a5680936a13a28bf4a7;hb=4b72a63eb61a01275493c4bfb51ba02152d1c5e1;hp=dcab2e5a6a0739a420bb5e2c3ce17b2f4439dc03;hpb=87387ff8aa2eb8b2daab625b9aec25d2b94c2b79;p=handbrake-jp%2Fhandbrake-jp-git.git diff --git a/libhb/muxmp4.c b/libhb/muxmp4.c index dcab2e5a..bc523f83 100644 --- a/libhb/muxmp4.c +++ b/libhb/muxmp4.c @@ -347,7 +347,8 @@ static int MP4Init( hb_mux_object_t * m ) (const uint8_t*)(audio->config.out.name), strlen(audio->config.out.name)); } - } else { + } else if( audio->config.out.codec == HB_ACODEC_FAAC || + audio->config.out.codec == HB_ACODEC_CA_AAC ) { mux_data->track = MP4AddAudioTrack( m->file, audio->config.out.samplerate, 1024, MP4_MPEG4_AUDIO_TYPE ); @@ -376,6 +377,32 @@ static int MP4Init( hb_mux_object_t * m ) /* Set the correct number of channels for this track */ MP4SetTrackIntegerProperty(m->file, mux_data->track, "mdia.minf.stbl.stsd.mp4a.channels", (uint16_t)HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown)); + } else if( audio->config.out.codec == HB_ACODEC_LAME ) { + mux_data->track = MP4AddAudioTrack( + m->file, + audio->config.out.samplerate, 1152, MP4_MPEG2_AUDIO_TYPE ); + + /* Tune track chunk duration */ + MP4TuneTrackDurationPerChunk( m, mux_data->track ); + + if (audio->config.out.name == NULL) { + MP4SetTrackBytesProperty( + m->file, mux_data->track, + "udta.name.value", + (const uint8_t*)"Stereo", strlen("Stereo")); + } + else { + MP4SetTrackBytesProperty( + m->file, mux_data->track, + "udta.name.value", + (const uint8_t*)(audio->config.out.name), + strlen(audio->config.out.name)); + } + + MP4SetAudioProfileLevel( m->file, 0x0F ); + + /* Set the correct number of channels for this track */ + MP4SetTrackIntegerProperty(m->file, mux_data->track, "mdia.minf.stbl.stsd.mp4a.channels", (uint16_t)HB_AMIXDOWN_GET_DISCRETE_CHANNEL_COUNT(audio->config.out.mixdown)); } /* Set the language for this track */ @@ -493,6 +520,46 @@ static int MP4Init( hb_mux_object_t * m ) MP4SetTrackIntegerProperty(m->file, mux_data->track, "tkhd.flags", (TRACK_DISABLED | TRACK_IN_MOVIE)); } } + else if( subtitle && subtitle->format == PICTURESUB && + subtitle->config.dest == PASSTHRUSUB ) + { + mux_data = calloc(1, sizeof( hb_mux_data_t ) ); + subtitle->mux_data = mux_data; + mux_data->subtitle = 1; + mux_data->sub_format = subtitle->format; + + mux_data->track = MP4AddSubpicTrack( m->file, 90000, subtitle->width, subtitle->height ); + + MP4SetTrackLanguage(m->file, mux_data->track, subtitle->iso639_2); + + /* Tune track chunk duration */ + MP4TuneTrackDurationPerChunk( m, mux_data->track ); + uint8_t palette[16][4]; + int ii; + for ( ii = 0; ii < 16; ii++ ) + { + palette[ii][0] = 0; + palette[ii][1] = (subtitle->palette[ii] >> 16) & 0xff; + palette[ii][2] = (subtitle->palette[ii] >> 8) & 0xff; + palette[ii][3] = (subtitle->palette[ii]) & 0xff; + } + if (!(MP4SetTrackESConfiguration( m->file, mux_data->track, + (uint8_t*)palette, 16 * 4 ))) + { + hb_error("muxmp4.c: MP4SetTrackESConfiguration failed!"); + *job->die = 1; + return 0; + } + if ( !subtitle_default || subtitle->config.default_track ) { + /* Enable the default subtitle track */ + MP4SetTrackIntegerProperty(m->file, mux_data->track, "tkhd.flags", (TRACK_ENABLED | TRACK_IN_MOVIE)); + subtitle_default = 1; + } + else + { + MP4SetTrackIntegerProperty(m->file, mux_data->track, "tkhd.flags", (TRACK_DISABLED | TRACK_IN_MOVIE)); + } + } } if (job->chapter_markers) @@ -1021,6 +1088,39 @@ static int MP4Mux( hb_mux_object_t * m, hb_mux_data_t * mux_data, mux_data->sum_dur += (buf->stop - buf->start); } + else if( mux_data->sub_format == PICTURESUB ) + { + /* Write an empty sample */ + if ( mux_data->sum_dur < buf->start ) + { + uint8_t empty[2] = {0,0}; + if( !MP4WriteSample( m->file, + mux_data->track, + empty, + 2, + buf->start - mux_data->sum_dur, + 0, + 1 )) + { + hb_error("Failed to write to output file, disk full?"); + *job->die = 1; + } + mux_data->sum_dur += buf->start - mux_data->sum_dur; + } + if( !MP4WriteSample( m->file, + mux_data->track, + buf->data, + buf->size, + buf->stop - buf->start, + 0, + 1 )) + { + hb_error("Failed to write to output file, disk full?"); + *job->die = 1; + } + + mux_data->sum_dur += (buf->stop - buf->start); + } } else {