dschmidt opened a new pull request, #2953:
URL: https://github.com/apache/tika/pull/2953

   Part 2 of TIKA-4779, following up on #2947 with the three audio properties 
that need parser work rather than plain mapping: `audio:bitrate` (average, bits 
per second), `audio:is-variable-bitrate` and `audio:has-drm`, defined under 
Tika's own namespace in `Audio.java`.
   
   **MP3:** the parser already walks every audio frame for the duration, and 
since frame duration does not depend on the bitrate, the plain mean over the 
frames is the exact average and differing frame bitrates are an exact VBR 
signal. The one special case is the Xing/Info/VBRI tag frame some encoders 
write first: it is a valid MPEG frame without audio, often at a different 
bitrate than the stream, so it is detected and excluded (a CBR file with an 
Info tag would otherwise be misreported as VBR, there is a fixture proving 
exactly that). I deliberately did not go the usual route of reading the bitrate 
from the Xing table itself: the full frame walk already happens for the 
duration, so the exact mean is free and works for files without any tag frame.
   
   **Vorbis:** the identification header declares upper/nominal/lower rates. 
Nominal maps to `audio:bitrate`; a zero-width bracket (upper == lower, no 
nominal) also pins an exact rate. Fixed rate means all three declared rates 
agree, or only a zero-width bracket is declared; anything else counts as 
variable.
   
   **MP4/M4A:** a `TikaMp4SoundHandler` (same extension pattern as TIKA-2861) 
structurally walks the sample description entries. Protected sample entry 
formats (`drms`, `enca`) set `audio:has-drm`; these markers are readable by 
design since DRM encrypts the payload, not the metadata. The average bitrate 
comes from the esds elementary stream descriptor, located as a child box of the 
entry (honoring the version-dependent entry layout, QuickTime `wave` wrappers 
and the optional ES descriptor fields). I deliberately avoided scanning the 
stsd bytes for fourcc markers: codec private data or a URL field can legally 
contain the string `sinf`, and a fixture covers that false positive.
   
   For files with several audio tracks the properties reflect the last sound 
track's sample description, consistent with how the existing MP4 audio metadata 
behaves.
   
   Note: the `hdlr` dispatch hook in `TikaMp4BoxHandler` overlaps with #2936; 
whichever merges second has a trivial rebase.
   
   Tests run against real files where the repo has them (`testMP4.m4a` with a 
declared average of 256000, the constant bitrate MP3 fixtures, `testVORBIS.ogg` 
copied from the integration tests). Synthetic fixtures cover only what no real 
specimen exercises: a VBR MP3, a CBR MP3 with an Info tag frame, a `drms` 
protected M4A and an M4A whose ES descriptor uses the optional fields.
   


-- 
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]

Reply via email to