summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2013-04-30 22:56:34 +0000
committerjstebbins <[email protected]>2013-04-30 22:56:34 +0000
commit57debc692488cc7dc9d522984e9c42076bad46b6 (patch)
tree16fe12c8fb4f59802f586535652c28e2271e35b5
parentac45c4c81ba3f189a35e1f52fca7dc036b70b6b6 (diff)
contrib: patch libbluray to fix "duplicate" filter
Titles with the same video clips but different stream lists got marked as duplicate. Caused valid titles to be filtered out. Example: Frankenweenie git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@5431 b64f7644-9d1e-0410-96f1-a4d463321fa5
-rw-r--r--contrib/libbluray/A01-filter-dup.patch80
1 files changed, 80 insertions, 0 deletions
diff --git a/contrib/libbluray/A01-filter-dup.patch b/contrib/libbluray/A01-filter-dup.patch
new file mode 100644
index 000000000..608f8dd1b
--- /dev/null
+++ b/contrib/libbluray/A01-filter-dup.patch
@@ -0,0 +1,80 @@
+diff --git a/src/libbluray/bdnav/navigation.c b/src/libbluray/bdnav/navigation.c
+index c8dc307..26d0000 100644
+--- a/src/libbluray/bdnav/navigation.c
++++ b/src/libbluray/bdnav/navigation.c
+@@ -32,9 +32,25 @@
+ #include <stdlib.h>
+ #include <string.h>
+
++static int _stream_cmp(MPLS_STREAM *a, MPLS_STREAM *b)
++{
++ if (a->stream_type == b->stream_type &&
++ a->coding_type == b->coding_type &&
++ a->pid == b->pid &&
++ a->subpath_id == b->subpath_id &&
++ a->subclip_id == b->subclip_id &&
++ a->format == b->format &&
++ a->rate == b->rate &&
++ a->char_code == b->char_code &&
++ memcmp(a->lang, b->lang, 4) == 0) {
++ return 1;
++ }
++ return 0;
++}
++
+ static int _filter_dup(MPLS_PL *pl_list[], unsigned count, MPLS_PL *pl)
+ {
+- unsigned ii, jj;
++ unsigned ii, jj, kk;
+
+ for (ii = 0; ii < count; ii++) {
+ if (pl->list_count != pl_list[ii]->list_count) {
+@@ -54,7 +70,48 @@ static int _filter_dup(MPLS_PL *pl_list[], unsigned count, MPLS_PL *pl)
+ pi1->out_time != pi2->out_time) {
+ break;
+ }
++ if (pi1->stn.num_video != pi2->stn.num_video ||
++ pi1->stn.num_audio != pi2->stn.num_audio ||
++ pi1->stn.num_pg != pi2->stn.num_pg ||
++ pi1->stn.num_ig != pi2->stn.num_ig ||
++ pi1->stn.num_secondary_audio != pi2->stn.num_secondary_audio ||
++ pi1->stn.num_secondary_video != pi2->stn.num_secondary_video) {
++ break;
++ }
++ for (kk = 0; kk < pi1->stn.num_video; kk++) {
++ if (!_stream_cmp(&pi1->stn.video[kk], &pi2->stn.video[kk])) {
++ goto next;
++ }
++ }
++ for (kk = 0; kk < pi1->stn.num_audio; kk++) {
++ if (!_stream_cmp(&pi1->stn.audio[kk], &pi2->stn.audio[kk])) {
++ goto next;
++ }
++ }
++ for (kk = 0; kk < pi1->stn.num_pg; kk++) {
++ if (!_stream_cmp(&pi1->stn.pg[kk], &pi2->stn.pg[kk])) {
++ goto next;
++ }
++ }
++ for (kk = 0; kk < pi1->stn.num_ig; kk++) {
++ if (!_stream_cmp(&pi1->stn.ig[kk], &pi2->stn.ig[kk])) {
++ goto next;
++ }
++ }
++ for (kk = 0; kk < pi1->stn.num_secondary_audio; kk++) {
++ if (!_stream_cmp(&pi1->stn.secondary_audio[kk],
++ &pi2->stn.secondary_audio[kk])) {
++ goto next;
++ }
++ }
++ for (kk = 0; kk < pi1->stn.num_secondary_video; kk++) {
++ if (!_stream_cmp(&pi1->stn.secondary_video[kk],
++ &pi2->stn.secondary_video[kk])) {
++ goto next;
++ }
++ }
+ }
++next:
+ if (jj != pl->list_count) {
+ continue;
+ }