dschmidt commented on code in PR #3062:
URL: https://github.com/apache/tika/pull/3062#discussion_r3846531666
##########
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp4/TikaMp4VideoHandler.java:
##########
@@ -76,6 +76,16 @@ private void extractFromSampleDescriptions(byte[] b) {
break;
}
int end = pos + (int) size;
+ String format = fourCc(b, pos + 4);
+ //protected streams replace the codec fourcc with 'encv' (ISO
common
+ //encryption) or 'drmi' (FairPlay); the original codec is in the
nested frma box
+ if ("encv".equals(format) || "drmi".equals(format)) {
+ String original = findOriginalFormat(b, pos +
VISUAL_ENTRY_SIZE, end, 0);
+ if (original != null) {
+ format = original;
+ }
+ }
+ tikaMetadata.set(Video.FORMAT, format);
Review Comment:
Stale: this reviewed an earlier revision. The frma-recovery path was removed
from the PR; protected streams now just report the entry fourcc, and the
protected-audio behavior that remains is covered by testDrmProtectedM4a.
##########
tika-parsers/tika-parsers-standard/tika-parsers-standard-modules/tika-parser-audiovideo-module/src/main/java/org/apache/tika/parser/mp4/TikaMp4VideoHandler.java:
##########
@@ -105,6 +115,38 @@ private static int findBtrtAverageBitRate(byte[] b, int
pos, int end) {
return 0;
}
+ private static final int MAX_BOX_DEPTH = 10;
+
+ /**
+ * Scans the child boxes of a protected ('encv'/'drmi') sample entry for
the
+ * 'frma' (original format) box nested in the 'sinf' protection scheme
+ * information box, and returns its codec fourcc, or null if there is none.
+ */
+ private static String findOriginalFormat(byte[] b, int pos, int end, int
depth) {
+ if (depth > MAX_BOX_DEPTH) {
+ return null;
+ }
+ while (pos + 8 <= end) {
+ long size = EndianUtils.getUIntBE(b, pos);
+ if (size < 8 || size > end - pos) {
+ return null;
+ }
+ int boxEnd = pos + (int) size;
+ String type = fourCc(b, pos + 4);
+ if ("frma".equals(type) && pos + 12 <= boxEnd) {
+ return fourCc(b, pos + 8);
+ }
+ if ("sinf".equals(type)) {
+ String original = findOriginalFormat(b, pos + 8, boxEnd, depth
+ 1);
+ if (original != null) {
+ return original;
+ }
+ }
+ pos = boxEnd;
+ }
+ return null;
+ }
Review Comment:
Stale: findOriginalFormat was removed along with the frma-recovery feature,
so there is nothing left to extract.
##########
tika-core/src/main/java/org/apache/tika/metadata/Video.java:
##########
@@ -37,4 +37,12 @@ public interface Video {
* reflects the last one.
*/
Property BITRATE = Property.internalInteger("video:bitrate");
+
+ /**
+ * The video track's four-character codec identifier from the MP4/QuickTime
+ * sample description (e.g. "avc1" for H.264, "hvc1"/"hev1" for HEVC). For
+ * protected streams this is the original codec from the 'frma' box.
Distinct
+ * from {@link XMPDM#VIDEO_COMPRESSOR}, the human-readable compressor name.
Review Comment:
The last-wins behavior is already documented in the javadoc and matches the
existing per-stream convention (e.g. Video.BITRATE).
##########
tika-core/src/main/java/org/apache/tika/metadata/Audio.java:
##########
@@ -84,6 +84,15 @@ public interface Audio {
*/
Property BITS_PER_SAMPLE =
Property.internalInteger("audio:bits-per-sample");
+ /**
+ * The audio track's four-character codec identifier from the MP4/QuickTime
+ * sample description (e.g. "mp4a" for AAC, "alac", "ac-3"), or the
protection
+ * scheme ("drms"/"enca") for protected streams, where {@link #HAS_DRM} is
also
+ * set. A per-stream value: with several audio tracks it reflects the last
one.
+ * Distinct from {@link XMPDM#AUDIO_COMPRESSOR}, the human-readable codec
name.
Review Comment:
Good catch, fixed in 9ec25dcca2 (javadoc and the handler comments now say
protected sample entry format).
##########
tika-core/src/main/java/org/apache/tika/metadata/Video.java:
##########
@@ -37,4 +37,13 @@ public interface Video {
* reflects the last one.
*/
Property BITRATE = Property.internalInteger("video:bitrate");
+
+ /**
+ * The video track's four-character codec identifier from the MP4/QuickTime
+ * sample description (e.g. "avc1" for H.264, "hvc1"/"hev1" for HEVC), or
the
+ * protection scheme ("encv"/"drmi") for protected streams. A per-stream
value:
+ * with several video tracks it reflects the last one. Distinct from
Review Comment:
Fixed in 9ec25dcca2, same wording change as on the audio side.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]