From c69f3e73d7dfd1ae816f1c4e567d577ce18504f4 Mon Sep 17 00:00:00 2001 From: Moritz Bunkus Date: Sun, 21 May 2017 20:02:21 +0200 Subject: [PATCH] JSON identification: include transport stream program number, bump version to 7 --- ...merge-identification-output-schema-v7.json | 407 ++++++++++++++++++ src/common/id_info.h | 1 + src/merge/id_result.h | 2 +- tests/test.d/simple_test.rb | 2 +- 4 files changed, 410 insertions(+), 2 deletions(-) create mode 100644 doc/json-schema/mkvmerge-identification-output-schema-v7.json diff --git a/doc/json-schema/mkvmerge-identification-output-schema-v7.json b/doc/json-schema/mkvmerge-identification-output-schema-v7.json new file mode 100644 index 000000000..1fabe6e8f --- /dev/null +++ b/doc/json-schema/mkvmerge-identification-output-schema-v7.json @@ -0,0 +1,407 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "id": "https://mkvtoolnix.download/doc/mkvmerge-identification-output-schema-v7.json", + "title": "mkvmerge identification output", + "description": "The JSON output produced by mkvmerge's file identification mode", + "type": "object", + "properties": { + "attachments": { + "description": "an array describing the attachments found if any", + "type": "array", + "items": { + "type": "object", + "properties": { + "content_type": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + }, + "file_name": { + "type": "string" + }, + "id": { + "type": "integer", + "minimum": 0 + }, + "size": { + "type": "integer", + "minimum": 0 + }, + "properties": { + "type": "object", + "properties": { + "uid": { + "type": "integer", + "minimum": 0 + } + }, + "additionalProperties": false + }, + "type": { + "type": "string" + } + }, + "additionalProperties": false, + "required": [ + "file_name", + "id", + "properties", + "size" + ] + } + }, + "chapters": { + "type": "array", + "items": { + "type": "object", + "properties": { + "num_entries": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "num_entries" + ] + } + }, + "container": { + "description": "information about the identified container", + "type": "object", + "properties": { + "properties": { + "description": "additional properties for the container varying by container format", + "type": "object", + "properties": { + "container_type": { + "description": "A unique number identifying the container type that's supposed to stay constant over all future releases of MKVToolNix", + "type": "integer", + "minLength": 1 + }, + "date_local": { + "description": "The muxing date in ISO 8601 format (in local time zone)", + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([+-][0-9]{2}:[0-9]{2}|Z)$" + }, + "date_utc": { + "description": "The muxing date in ISO 8601 format (in UTC)", + "type": "string", + "pattern": "^[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9]{2}:[0-9]{2}:[0-9]{2}([+-][0-9]{2}:[0-9]{2}|Z)$" + }, + "duration": { + "description": "The file's/segment's duration in nanoseconds", + "type": "integer", + "minimum": 0 + }, + "is_providing_timecodes": { + "description": "States whether or not the container has timestamps for the packets (e.g. Matroska, MP4) or not (e.g. SRT, MP3)", + "type": "boolean" + }, + "muxing_application": { + "description": "A Unicode string containing the name and possibly version of the low-level library or application that created the file", + "type": "string" + }, + "next_segment_uid": { + "description": "A hexadecimal string of the next segment's UID (only for Matroska files)", + "type": "string", + "minLength": 32, + "maxLength": 32 + }, + "other_file": { + "description": "An array of names of additional files processed as well", + "type": "array", + "items": { + "type": "string" + } + }, + "playlist": { + "description": "States whether or not the identified file is a playlist (e.g. MPLS) referring to several other files", + "type": "boolean" + }, + "playlist_chapters": { + "description": "The number of chapters in a playlist if it is a one", + "type": "integer", + "minimum": 0 + }, + "playlist_duration": { + "description": "The total duration in nanoseconds of all files referenced by the playlist if it is a one", + "type": "integer", + "minimum": 0 + }, + "playlist_file": { + "description": "An array of file names the playlist contains", + "type": "array", + "items": { + "type": "string" + } + }, + "playlist_size": { + "description": "The total size in bytes of all files referenced by the playlist if it is a one", + "type": "integer", + "minimum": 0 + }, + "previous_segment_uid": { + "description": "A hexadecimal string of the previous segment's UID (only for Matroska files)", + "type": "string", + "minLength": 32, + "maxLength": 32 + }, + "segment_uid": { + "description": "A hexadecimal string of the segment's UID (only for Matroska files)", + "type": "string", + "minLength": 32, + "maxLength": 32 + }, + "title": { + "type": "string" + }, + "writing_application": { + "description": "A Unicode string containing the name and possibly version of the high-level application that created the file", + "type": "string" + } + }, + "additionalProperties": false + }, + "recognized": { + "description": "States whether or not mkvmerge knows about the format", + "type": "boolean" + }, + "supported": { + "description": "States whether or not mkvmerge can read the format", + "type": "boolean" + }, + "type": { + "description": "A human-readable description/name for the container format", + "type": "string", + "minLength": 1 + } + }, + "additionalProperties": false, + "required": [ + "recognized", + "supported" + ] + }, + "errors": { + "type": "array", + "items": { + "type": "string" + } + }, + "file_name": { + "description": "the identified file's name", + "type": "string", + "minLength": 1 + }, + "global_tags": { + "type": "array", + "items": { + "type": "object", + "properties": { + "num_entries": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "num_entries" + ] + } + }, + "identification_format_version": { + "description": "The output format's version", + "type": "integer", + "minimum": 7, + "maximum": 7 + }, + "track_tags": { + "type": "array", + "items": { + "type": "object", + "properties": { + "num_entries": { + "type": "integer" + }, + "track_id": { + "type": "integer" + } + }, + "additionalProperties": false, + "required": [ + "num_entries", + "track_id" + ] + } + }, + "tracks": { + "type": "array", + "items": { + "type": "object", + "properties": { + "codec": { + "type": "string", + "minLength": 1 + }, + "id": { + "type": "integer", + "minLength": 0 + }, + "type": { + "type": "string" + }, + "properties": { + "type": "object", + "properties": { + "aac_is_sbr": { + "type": "string", + "enum": [ + "true", + "false", + "unknown" + ] + }, + "audio_bits_per_sample": { + "type": "integer", + "minimum": 0 + }, + "audio_channels": { + "type": "integer", + "minimum": 0 + }, + "audio_sampling_frequency": { + "type": "integer", + "minimum": 0 + }, + "codec_delay": { + "type": "integer" + }, + "codec_id": { + "type": "string" + }, + "codec_private_data": { + "type": "string" + }, + "codec_private_length": { + "type": "integer", + "minimum": 0 + }, + "content_encoding_algorithms": { + "type": "string", + "minLength": 1 + }, + "default_duration": { + "type": "integer", + "minimum": 0 + }, + "default_track": { + "type": "boolean" + }, + "display_dimensions": { + "type": "string", + "pattern": "^[0-9]+x[0-9]+$" + }, + "enabled_track": { + "type": "boolean" + }, + "forced_track": { + "type": "boolean" + }, + "language": { + "type": "string" + }, + "minimum_timestamp": { + "description": "The minimum timestamp in nanoseconds of all the frames of this track found within the first couple of seconds of the file", + "type": "integer", + "minimum": 0 + }, + "multiplexed_tracks": { + "description": "An array of track IDs indicating which tracks were originally multiplexed within the same track in the source file", + "type": "array", + "items": { + "type": "integer", + "minimum": 0 + } + }, + "number": { + "type": "integer", + "minimum": 0 + }, + "packetizer": { + "type": "string", + "minLength": 1 + }, + "pixel_dimensions": { + "type": "string", + "pattern": "^[0-9]+x[0-9]+$" + }, + "program_number": { + "type": "integer", + "minimum": 0 + }, + "stereo_mode": { + "type": "integer", + "minimum": 0 + }, + "stream_id": { + "type": "string", + "pattern": "^[0-9a-f]{2}$" + }, + "sub_stream_id": { + "type": "string", + "pattern": "^[0-9a-f]{2}$" + }, + "tag_artist": { + "type": "string" + }, + "tag_bitsps": { + "type": "string" + }, + "tag_bps": { + "type": "string" + }, + "tag_fps": { + "type": "string" + }, + "tag_title": { + "type": "string" + }, + "teletext_page": { + "type": "integer", + "minimum": 0 + }, + "text_subtitles": { + "type": "boolean" + }, + "track_name": { + "type": "string" + }, + "ts_pid": { + "type": "integer", + "minimum": 0 + }, + "uid": { + "type": "integer", + "minimum": 0 + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false, + "required": [ + "codec", + "id", + "type" + ] + } + }, + "warnings": { + "type": "array", + "items": { + "type": "string" + } + } + } +} diff --git a/src/common/id_info.h b/src/common/id_info.h index c2acc5f0f..cee1932fc 100644 --- a/src/common/id_info.h +++ b/src/common/id_info.h @@ -57,6 +57,7 @@ char const * const playlist_duration = "playlist_duration"; char const * const playlist_file = "playlist_file"; // container uinstr char const * const playlist_size = "playlist_size"; // container unsigned-integer char const * const previous_segment_uid = "previous_segment_uid"; // container ascii-string format:^[0-9A-F]{32}$ +char const * const program_number = "program_number"; // track unsigned-integer char const * const segment_uid = "segment_uid"; // container ascii-string format:^[0-9A-F]{32}$ char const * const stereo_mode = "stereo_mode"; // track unsigned-integer char const * const stream_id = "stream_id"; // track unsigned-integer diff --git a/src/merge/id_result.h b/src/merge/id_result.h index 46e13246d..aa99980d0 100644 --- a/src/merge/id_result.h +++ b/src/merge/id_result.h @@ -27,7 +27,7 @@ #define ID_RESULT_TAGS "tags" #define ID_RESULT_GLOBAL_TAGS_ID -1 -#define ID_JSON_FORMAT_VERSION 6 +#define ID_JSON_FORMAT_VERSION 7 struct id_result_t { int64_t id; diff --git a/tests/test.d/simple_test.rb b/tests/test.d/simple_test.rb index c5e28d7be..16bab3751 100644 --- a/tests/test.d/simple_test.rb +++ b/tests/test.d/simple_test.rb @@ -333,7 +333,7 @@ class SimpleTest json_store = JsonSchema::DocumentStore.new parser = JsonSchema::Parser.new expander = JsonSchema::ReferenceExpander.new - schema = parser.parse JSON.load(File.read("../doc/json-schema/mkvmerge-identification-output-schema-v6.json")) + schema = parser.parse JSON.load(File.read("../doc/json-schema/mkvmerge-identification-output-schema-v7.json")) expander.expand(schema, store: json_store) json_store.add_schema schema