diff options
author | jstebbins <[email protected]> | 2013-04-30 22:56:34 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2013-04-30 22:56:34 +0000 |
commit | 57debc692488cc7dc9d522984e9c42076bad46b6 (patch) | |
tree | 16fe12c8fb4f59802f586535652c28e2271e35b5 | |
parent | ac45c4c81ba3f189a35e1f52fca7dc036b70b6b6 (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.patch | 80 |
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; + } |