diff --git a/CHANGELOG.md b/CHANGELOG.md index fd4b535..8be96cd 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,13 @@ All notable changes to this project will be documented in this file. +## [1.1.6] - 2023-10-25 + +### Changed + +- codecs: Special handling for mp3 streams inside mp4 containers. +- codecs: Handle ffprobe level -99 in mp4 files. + ## [1.1.5] - 2023-10-22 ### Changed diff --git a/codecs/codecs.js b/codecs/codecs.js index d3fc265..169ad82 100644 --- a/codecs/codecs.js +++ b/codecs/codecs.js @@ -141,6 +141,12 @@ export function getFullMIMEString(info) { for (const stream of info.streams) { if (stream.codec_type === 'audio') { + // MP3 can sometimes have codec_tag_string=mp4a, so we check for it first. + if (stream.codec_name === 'mp3') { + codecFrags.add('mp3'); + continue; + } + switch (stream.codec_tag_string) { case 'mp4a': codecFrags.add(getMP4ACodecString(stream)); break; default: @@ -267,8 +273,8 @@ function getVP09CodecString(stream) { } // Add LL hex digits. - // If ffprobe is spitting out -99 as level... Just return 'vp9'. - if (stream.level === -99) { return 'vp9'; } + // If ffprobe is spitting out -99 as level... it means unknown, so we will guess level=1. + if (stream.level === -99) { frag += `.10`; } else { const levelAsHex = Number(stream.level).toString(16).toUpperCase().padStart(2, '0'); if (levelAsHex.length !== 2) { @@ -279,8 +285,8 @@ function getVP09CodecString(stream) { } // Add DD hex digits. - // TODO: This is just a guess at DD (16?), need to try and extract this info from - // ffprobe JSON output instead. + // TODO: This is just a guess at DD (10-bit color depth), need to try and extract this info + // from ffprobe JSON output instead. frag += '.10'; return frag; diff --git a/package.json b/package.json index 63ded57..e3283e4 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@codedread/bitjs", - "version": "1.1.5", + "version": "1.1.6", "description": "Binary Tools for JavaScript", "homepage": "https://github.com/codedread/bitjs", "author": "Jeff Schiller", diff --git a/tests/codecs.spec.js b/tests/codecs.spec.js index 0d25f17..a2a94ae 100644 --- a/tests/codecs.spec.js +++ b/tests/codecs.spec.js @@ -349,11 +349,11 @@ describe('codecs test suite', () => { }); }); - it('detects level = -99', () => { - info.streams[0].level = -99; // I'm not sure what ffprobe means by this. + it('detects level = -99 as level 1', () => { + info.streams[0].level = -99; // I believe this is the "unknown" value from ffprobe. expect(getFullMIMEString(info)) .to.be.a('string') - .and.equals('video/webm; codecs="vp9"'); + .and.equals('video/webm; codecs="vp09.00.10.10"'); }); }); @@ -575,6 +575,18 @@ describe('codecs test suite', () => { }); }); + describe('MP3', () => { + it('detects MP3', () => { + /** @type {ProbeInfo} */ + let info = { + format: { format_name: 'mov,mp4,m4a,3gp,3g2,mj2' }, + streams: [ { codec_type: 'audio', codec_name: 'mp3', codec_tag_string: 'mp4a' } ], + }; + expect(getShortMIMEString(info)).equals('audio/mp4'); + expect(getFullMIMEString(info)).equals('audio/mp4; codecs="mp3"'); + }); + }); + describe('WAV', () => { it('detects WAV', () => { /** @type {ProbeInfo} */