Commit 00f9fc67 by Oliver Woodman

Don't propagate GaplessInfoHolder when parsing mp4 metadata

parent 6673483a
...@@ -94,7 +94,7 @@ public final class GaplessInfoHolder { ...@@ -94,7 +94,7 @@ public final class GaplessInfoHolder {
* @param data The comment's payload data. * @param data The comment's payload data.
* @return Whether the holder was populated. * @return Whether the holder was populated.
*/ */
public boolean setFromComment(String name, String data) { private boolean setFromComment(String name, String data) {
if (!GAPLESS_COMMENT_ID.equals(name)) { if (!GAPLESS_COMMENT_ID.equals(name)) {
return false; return false;
} }
......
...@@ -407,10 +407,8 @@ import java.util.List; ...@@ -407,10 +407,8 @@ import java.util.List;
* *
* @param udtaAtom The udta (user data) atom to decode. * @param udtaAtom The udta (user data) atom to decode.
* @param isQuickTime True for QuickTime media. False otherwise. * @param isQuickTime True for QuickTime media. False otherwise.
* @param out {@link GaplessInfoHolder} to populate with gapless playback information.
*/ */
public static Metadata parseUdta(Atom.LeafAtom udtaAtom, boolean isQuickTime, public static Metadata parseUdta(Atom.LeafAtom udtaAtom, boolean isQuickTime) {
GaplessInfoHolder out) {
if (isQuickTime) { if (isQuickTime) {
// Meta boxes are regular boxes rather than full boxes in QuickTime. For now, don't try and // Meta boxes are regular boxes rather than full boxes in QuickTime. For now, don't try and
// decode one. // decode one.
...@@ -424,14 +422,14 @@ import java.util.List; ...@@ -424,14 +422,14 @@ import java.util.List;
if (atomType == Atom.TYPE_meta) { if (atomType == Atom.TYPE_meta) {
udtaData.setPosition(udtaData.getPosition() - Atom.HEADER_SIZE); udtaData.setPosition(udtaData.getPosition() - Atom.HEADER_SIZE);
udtaData.setLimit(udtaData.getPosition() + atomSize); udtaData.setLimit(udtaData.getPosition() + atomSize);
return parseMetaAtom(udtaData, out); return parseMetaAtom(udtaData);
} }
udtaData.skipBytes(atomSize - Atom.HEADER_SIZE); udtaData.skipBytes(atomSize - Atom.HEADER_SIZE);
} }
return null; return null;
} }
private static Metadata parseMetaAtom(ParsableByteArray data, GaplessInfoHolder out) { private static Metadata parseMetaAtom(ParsableByteArray data) {
data.skipBytes(Atom.FULL_HEADER_SIZE); data.skipBytes(Atom.FULL_HEADER_SIZE);
ParsableByteArray ilst = new ParsableByteArray(); ParsableByteArray ilst = new ParsableByteArray();
while (data.bytesLeft() >= Atom.HEADER_SIZE) { while (data.bytesLeft() >= Atom.HEADER_SIZE) {
...@@ -440,7 +438,7 @@ import java.util.List; ...@@ -440,7 +438,7 @@ import java.util.List;
if (atomType == Atom.TYPE_ilst) { if (atomType == Atom.TYPE_ilst) {
ilst.reset(data.data, data.getPosition() + payloadSize); ilst.reset(data.data, data.getPosition() + payloadSize);
ilst.setPosition(data.getPosition()); ilst.setPosition(data.getPosition());
Metadata metadata = parseIlst(ilst, out); Metadata metadata = parseIlst(ilst);
if (metadata != null) { if (metadata != null) {
return metadata; return metadata;
} }
...@@ -450,13 +448,13 @@ import java.util.List; ...@@ -450,13 +448,13 @@ import java.util.List;
return null; return null;
} }
private static Metadata parseIlst(ParsableByteArray ilst, GaplessInfoHolder out) { private static Metadata parseIlst(ParsableByteArray ilst) {
ArrayList<Metadata.Entry> entries = new ArrayList<>(); ArrayList<Metadata.Entry> entries = new ArrayList<>();
while (ilst.bytesLeft() > 0) { while (ilst.bytesLeft() > 0) {
int position = ilst.getPosition(); int position = ilst.getPosition();
int endPosition = position + ilst.readInt(); int endPosition = position + ilst.readInt();
int type = ilst.readInt(); int type = ilst.readInt();
parseIlstElement(ilst, type, endPosition, entries, out); parseIlstElement(ilst, type, endPosition, entries);
ilst.setPosition(endPosition); ilst.setPosition(endPosition);
} }
return entries.isEmpty() ? null : new Metadata(entries); return entries.isEmpty() ? null : new Metadata(entries);
...@@ -506,7 +504,7 @@ import java.util.List; ...@@ -506,7 +504,7 @@ import java.util.List;
// TBD: covr = cover art, various account and iTunes specific attributes, more TV attributes // TBD: covr = cover art, various account and iTunes specific attributes, more TV attributes
private static void parseIlstElement(ParsableByteArray ilst, int type, int endPosition, private static void parseIlstElement(ParsableByteArray ilst, int type, int endPosition,
List<Metadata.Entry> builder, GaplessInfoHolder out) { List<Metadata.Entry> builder) {
if (type == TYPE_NAME_1 || type == TYPE_NAME_2 || type == TYPE_NAME_3 || type == TYPE_NAME_4) { if (type == TYPE_NAME_1 || type == TYPE_NAME_2 || type == TYPE_NAME_3 || type == TYPE_NAME_4) {
parseTextAttribute(builder, "TIT2", ilst); parseTextAttribute(builder, "TIT2", ilst);
} else if (type == TYPE_COMMENT_1 || type == TYPE_COMMENT_2) { } else if (type == TYPE_COMMENT_1 || type == TYPE_COMMENT_2) {
...@@ -557,7 +555,7 @@ import java.util.List; ...@@ -557,7 +555,7 @@ import java.util.List;
} else if (type == TYPE_SHOW) { } else if (type == TYPE_SHOW) {
parseTextAttribute(builder, "show", ilst); parseTextAttribute(builder, "show", ilst);
} else if (type == Atom.TYPE_DASHES) { } else if (type == Atom.TYPE_DASHES) {
parseExtendedAttribute(builder, ilst, endPosition, out); parseExtendedAttribute(builder, ilst, endPosition);
} }
} }
...@@ -678,7 +676,7 @@ import java.util.List; ...@@ -678,7 +676,7 @@ import java.util.List;
} }
private static void parseExtendedAttribute(List<Metadata.Entry> builder, ParsableByteArray ilst, private static void parseExtendedAttribute(List<Metadata.Entry> builder, ParsableByteArray ilst,
int endPosition, GaplessInfoHolder out) { int endPosition) {
String domain = null; String domain = null;
String name = null; String name = null;
Object value = null; Object value = null;
...@@ -699,14 +697,9 @@ import java.util.List; ...@@ -699,14 +697,9 @@ import java.util.List;
} }
if (value != null) { if (value != null) {
if (!out.hasGaplessInfo() && Util.areEqual(domain, "com.apple.iTunes")) { if (Util.areEqual(domain, "com.apple.iTunes")) {
String s = value instanceof byte[] ? new String((byte[]) value) : value.toString();
out.setFromComment(name, s);
}
if (Util.areEqual(domain, "com.apple.iTunes") && Util.areEqual(name, "iTunNORM") && (value instanceof byte[])) {
String s = new String((byte[]) value); String s = new String((byte[]) value);
Id3Frame frame = new CommentFrame("eng", "iTunNORM", s); Id3Frame frame = new CommentFrame("eng", name, s);
builder.add(frame); builder.add(frame);
} else if (domain != null && name != null) { } else if (domain != null && name != null) {
String extendedName = domain + "." + name; String extendedName = domain + "." + name;
......
...@@ -315,7 +315,10 @@ public final class Mp4Extractor implements Extractor, SeekMap { ...@@ -315,7 +315,10 @@ public final class Mp4Extractor implements Extractor, SeekMap {
GaplessInfoHolder gaplessInfoHolder = new GaplessInfoHolder(); GaplessInfoHolder gaplessInfoHolder = new GaplessInfoHolder();
Atom.LeafAtom udta = moov.getLeafAtomOfType(Atom.TYPE_udta); Atom.LeafAtom udta = moov.getLeafAtomOfType(Atom.TYPE_udta);
if (udta != null) { if (udta != null) {
metadata = AtomParsers.parseUdta(udta, isQuickTime, gaplessInfoHolder); metadata = AtomParsers.parseUdta(udta, isQuickTime);
if (metadata != null) {
gaplessInfoHolder.setFromMetadata(metadata);
}
} }
for (int i = 0; i < moov.containerChildren.size(); i++) { for (int i = 0; i < moov.containerChildren.size(); i++) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment