summaryrefslogtreecommitdiffstats
path: root/contrib
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2011-10-12 20:19:33 +0000
committerjstebbins <[email protected]>2011-10-12 20:19:33 +0000
commit9d95d88d5a05abf6086ab474c0aa2583a9da6345 (patch)
tree5ff672576f6efacb2f03a36b85a88a8b2d3e85e1 /contrib
parentd41d9e0d88a689a11fe0978d4e415b89e72c2e62 (diff)
Add flac + quality + compression level support
Adds flac audio to cli, lingui, and macgui Adds quality and compression level options to cli Adds quality option to lingui Quality option works for vorbis and lame git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4281 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'contrib')
-rw-r--r--contrib/ffmpeg/module.defs1
-rw-r--r--contrib/libmkv/A00-update-track-private-data.patch144
2 files changed, 145 insertions, 0 deletions
diff --git a/contrib/ffmpeg/module.defs b/contrib/ffmpeg/module.defs
index 36c486463..732b7778a 100644
--- a/contrib/ffmpeg/module.defs
+++ b/contrib/ffmpeg/module.defs
@@ -18,6 +18,7 @@ FFMPEG.CONFIGURE.extra = \
--disable-vaapi \
--disable-dxva2 \
--enable-bzlib \
+ --enable-encoder=flac \
--enable-encoder=ac3 \
--enable-encoder=aac \
--enable-encoder=mpeg4 \
diff --git a/contrib/libmkv/A00-update-track-private-data.patch b/contrib/libmkv/A00-update-track-private-data.patch
new file mode 100644
index 000000000..97afcf93c
--- /dev/null
+++ b/contrib/libmkv/A00-update-track-private-data.patch
@@ -0,0 +1,144 @@
+diff --git a/include/libmkv.h b/include/libmkv.h
+index 4bd6f8c..146a91f 100644
+--- a/include/libmkv.h
++++ b/include/libmkv.h
+@@ -216,6 +216,7 @@ struct mk_TrackConfig_s {
+ mk_Writer *mk_createWriter(const char *filename, int64_t timescale,
+ uint8_t vlc_compat);
+ mk_Track *mk_createTrack(mk_Writer *w, mk_TrackConfig *tc);
++int mk_updateTrackPrivateData(mk_Writer *w, mk_Track *track, uint8_t * data, int size );
+ int mk_writeHeader(mk_Writer *w, const char *writingApp);
+ int mk_startFrame(mk_Writer *w, mk_Track *track);
+ int mk_flushFrame(mk_Writer *w, mk_Track *track);
+diff --git a/src/matroska.c b/src/matroska.c
+index f61b6f2..b14fd4c 100644
+--- a/src/matroska.c
++++ b/src/matroska.c
+@@ -171,8 +171,17 @@ int mk_writeHeader(mk_Writer *w, const char *writingApp)
+
+ w->seek_data.tracks = w->root->d_cur - w->segment_ptr;
+
+- if (w->tracks)
+- CHECK(mk_closeContext(w->tracks, 0));
++ if (w->tracks) {
++ mk_Track * tk;
++ int i;
++
++ CHECK(mk_closeContext(w->tracks, &offset));
++ for (i = 0; i < w->num_tracks; i++) {
++ tk = w->tracks_arr[i];
++ if (tk->private_data_size)
++ tk->private_data_ptr += offset;
++ }
++ }
+
+ CHECK(mk_flushContextData(w->root));
+
+@@ -487,12 +496,8 @@ int mk_close(mk_Writer *w)
+
+ for (i = w->num_tracks - 1; i >= 0; i--) {
+ tk = w->tracks_arr[i];
+- w->tracks_arr[i] = NULL;
+- --w->num_tracks;
+ if (mk_flushFrame(w, tk) < 0)
+ ret = -1;
+- free(tk);
+- tk = NULL;
+ }
+
+ if (mk_closeCluster(w) < 0)
+@@ -611,6 +616,24 @@ int mk_close(mk_Writer *w)
+ ret = -1;
+ }
+
++ /* update any track private data that may have changed */
++ for (i = w->num_tracks - 1; i >= 0; i--) {
++ tk = w->tracks_arr[i];
++ if (tk->private_data_size && tk->private_data)
++ {
++ if (mk_seekFile(w, tk->private_data_ptr) < 0)
++ ret = -1;
++ if (mk_writeBin(w->root, MATROSKA_ID_CODECPRIVATE,
++ tk->private_data, tk->private_data_size) < 0 ||
++ mk_flushContextData(w->root) < 0)
++ ret = -1;
++ free(tk->private_data);
++ }
++ w->tracks_arr[i] = NULL;
++ --w->num_tracks;
++ free(tk);
++ }
++
+ if (mk_closeContext(w->root, 0) < 0)
+ ret = -1;
+ mk_destroyContexts(w);
+diff --git a/src/matroska.h b/src/matroska.h
+index 515c5ab..2e1eb2f 100644
+--- a/src/matroska.h
++++ b/src/matroska.h
+@@ -269,6 +269,9 @@ struct mk_Track_s {
+ uint64_t default_duration;
+ mk_TrackType track_type;
+ int64_t prev_cue_pos;
++ uint8_t *private_data;
++ unsigned private_data_size;
++ int64_t private_data_ptr;
+
+ struct {
+ mk_Context *data;
+diff --git a/src/tracks.c b/src/tracks.c
+index d9fc38b..0e224e4 100644
+--- a/src/tracks.c
++++ b/src/tracks.c
+@@ -81,6 +81,8 @@ mk_Track *mk_createTrack(mk_Writer *w, mk_TrackConfig *tc)
+ return NULL;
+ if (tc->codecPrivateSize && (tc->codecPrivate != NULL)) {
+ /* CodecPrivate */
++ track->private_data_size = tc->codecPrivateSize;
++ track->private_data_ptr = ti->d_cur;
+ if (mk_writeBin(ti, MATROSKA_ID_CODECPRIVATE, tc->codecPrivate, tc->codecPrivateSize) < 0)
+ return NULL;
+ }
+@@ -191,17 +193,40 @@ mk_Track *mk_createTrack(mk_Writer *w, mk_TrackConfig *tc)
+ return NULL;
+ }
+
+- if (mk_closeContext(ti, 0) < 0)
++ int64_t offset = 0;
++ if (mk_closeContext(ti, &offset) < 0)
+ return NULL;
++ track->private_data_ptr += offset;
+
+ return track;
+ }
+
++int mk_updateTrackPrivateData(mk_Writer *w, mk_Track *track, uint8_t * data, int size )
++{
++ /* can not write data larger than was previously reserved */
++ if (size > track->private_data_size)
++ return -1;
++
++ if (track->private_data == NULL)
++ track->private_data = calloc(1, track->private_data_size);
++ memcpy(track->private_data, data, size);
++}
++
+ int mk_writeTracks(mk_Writer *w, mk_Context *tracks)
+ {
++ int i;
++ mk_Track * tk;
++ int64_t offset = 0;
++
+ w->seek_data.tracks = w->root->d_cur;
+
+- CHECK(mk_closeContext(w->tracks, 0));
++ CHECK(mk_closeContext(w->tracks, &offset));
++
++ for (i = 0; i < w->num_tracks; i++) {
++ tk = w->tracks_arr[i];
++ if (tk->private_data_size)
++ tk->private_data_ptr += offset;
++ }
+
+ return 0;
+ }