gstreamer/gst/matroska/matroska-ids.h
Thiago Santos d56b11af56 matroska: store stream tags and push as updated
New tags can be found on different parts of the file, so this patch
keeps the stream taglists around for the life cycle of the pad
and adds those new tags as found. Then a new tag is found, the
pad's is marked with a tags changed flag, making the element push
a new tag event on the next check. Before this, we were sending
only the newly found tags, as the element was losing its taglist
when pushing the event.
2015-03-28 11:20:39 -03:00

660 lines
27 KiB
C

/* GStreamer Matroska muxer/demuxer
* (c) 2003 Ronald Bultje <rbultje@ronald.bitfreak.net>
*
* matroska-ids.h: matroska file/stream data IDs
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef __GST_MATROSKA_IDS_H__
#define __GST_MATROSKA_IDS_H__
#include <gst/gst.h>
#include "ebml-ids.h"
/*
* EBML DocType.
*/
#define GST_MATROSKA_DOCTYPE_MATROSKA "matroska"
#define GST_MATROSKA_DOCTYPE_WEBM "webm"
/*
* Matroska element IDs. max. 32-bit.
*/
/* toplevel Segment */
#define GST_MATROSKA_ID_SEGMENT 0x18538067
/* matroska top-level master IDs, childs of Segment */
#define GST_MATROSKA_ID_SEGMENTINFO 0x1549A966
#define GST_MATROSKA_ID_TRACKS 0x1654AE6B
#define GST_MATROSKA_ID_CUES 0x1C53BB6B
#define GST_MATROSKA_ID_TAGS 0x1254C367
#define GST_MATROSKA_ID_SEEKHEAD 0x114D9B74
#define GST_MATROSKA_ID_CLUSTER 0x1F43B675
#define GST_MATROSKA_ID_ATTACHMENTS 0x1941A469
#define GST_MATROSKA_ID_CHAPTERS 0x1043A770
/* IDs in the SegmentInfo master */
#define GST_MATROSKA_ID_TIMECODESCALE 0x2AD7B1
#define GST_MATROSKA_ID_DURATION 0x4489
#define GST_MATROSKA_ID_WRITINGAPP 0x5741
#define GST_MATROSKA_ID_MUXINGAPP 0x4D80
#define GST_MATROSKA_ID_DATEUTC 0x4461
#define GST_MATROSKA_ID_SEGMENTUID 0x73A4
#define GST_MATROSKA_ID_SEGMENTFILENAME 0x7384
#define GST_MATROSKA_ID_PREVUID 0x3CB923
#define GST_MATROSKA_ID_PREVFILENAME 0x3C83AB
#define GST_MATROSKA_ID_NEXTUID 0x3EB923
#define GST_MATROSKA_ID_NEXTFILENAME 0x3E83BB
#define GST_MATROSKA_ID_TITLE 0x7BA9
#define GST_MATROSKA_ID_SEGMENTFAMILY 0x4444
#define GST_MATROSKA_ID_CHAPTERTRANSLATE 0x6924
/* IDs in the ChapterTranslate master */
#define GST_MATROSKA_ID_CHAPTERTRANSLATEEDITIONUID 0x69FC
#define GST_MATROSKA_ID_CHAPTERTRANSLATECODEC 0x69BF
#define GST_MATROSKA_ID_CHAPTERTRANSLATEID 0x69A5
/* ID in the Tracks master */
#define GST_MATROSKA_ID_TRACKENTRY 0xAE
/* IDs in the TrackEntry master */
#define GST_MATROSKA_ID_TRACKNUMBER 0xD7
#define GST_MATROSKA_ID_TRACKUID 0x73C5
#define GST_MATROSKA_ID_TRACKTYPE 0x83
#define GST_MATROSKA_ID_TRACKAUDIO 0xE1
#define GST_MATROSKA_ID_TRACKVIDEO 0xE0
#define GST_MATROSKA_ID_CONTENTENCODINGS 0x6D80
#define GST_MATROSKA_ID_CODECID 0x86
#define GST_MATROSKA_ID_CODECPRIVATE 0x63A2
#define GST_MATROSKA_ID_CODECNAME 0x258688
#define GST_MATROSKA_ID_TRACKNAME 0x536E
#define GST_MATROSKA_ID_TRACKLANGUAGE 0x22B59C
#define GST_MATROSKA_ID_TRACKFLAGENABLED 0xB9
#define GST_MATROSKA_ID_TRACKFLAGDEFAULT 0x88
#define GST_MATROSKA_ID_TRACKFLAGFORCED 0x55AA
#define GST_MATROSKA_ID_TRACKFLAGLACING 0x9C
#define GST_MATROSKA_ID_TRACKMINCACHE 0x6DE7
#define GST_MATROSKA_ID_TRACKMAXCACHE 0x6DF8
#define GST_MATROSKA_ID_TRACKDEFAULTDURATION 0x23E383
#define GST_MATROSKA_ID_TRACKTIMECODESCALE 0x23314F
#define GST_MATROSKA_ID_MAXBLOCKADDITIONID 0x55EE
#define GST_MATROSKA_ID_TRACKATTACHMENTLINK 0x7446
#define GST_MATROSKA_ID_TRACKOVERLAY 0x6FAB
#define GST_MATROSKA_ID_TRACKTRANSLATE 0x6624
/* semi-draft */
#define GST_MATROSKA_ID_TRACKOFFSET 0x537F
/* semi-draft */
#define GST_MATROSKA_ID_CODECSETTINGS 0x3A9697
/* semi-draft */
#define GST_MATROSKA_ID_CODECINFOURL 0x3B4040
/* semi-draft */
#define GST_MATROSKA_ID_CODECDOWNLOADURL 0x26B240
/* semi-draft */
#define GST_MATROSKA_ID_CODECDECODEALL 0xAA
/* IDs in the TrackTranslate master */
#define GST_MATROSKA_ID_TRACKTRANSLATEEDITIONUID 0x66FC
#define GST_MATROSKA_ID_TRACKTRANSLATECODEC 0x66BF
#define GST_MATROSKA_ID_TRACKTRANSLATETRACKID 0x66A5
/* IDs in the TrackVideo master */
/* NOTE: This one is here only for backward compatibility.
* Use _TRACKDEFAULDURATION */
#define GST_MATROSKA_ID_VIDEOFRAMERATE 0x2383E3
#define GST_MATROSKA_ID_VIDEODISPLAYWIDTH 0x54B0
#define GST_MATROSKA_ID_VIDEODISPLAYHEIGHT 0x54BA
#define GST_MATROSKA_ID_VIDEODISPLAYUNIT 0x54B2
#define GST_MATROSKA_ID_VIDEOPIXELWIDTH 0xB0
#define GST_MATROSKA_ID_VIDEOPIXELHEIGHT 0xBA
#define GST_MATROSKA_ID_VIDEOPIXELCROPBOTTOM 0x54AA
#define GST_MATROSKA_ID_VIDEOPIXELCROPTOP 0x54BB
#define GST_MATROSKA_ID_VIDEOPIXELCROPLEFT 0x54CC
#define GST_MATROSKA_ID_VIDEOPIXELCROPRIGHT 0x54DD
#define GST_MATROSKA_ID_VIDEOFLAGINTERLACED 0x9A
/* semi-draft */
#define GST_MATROSKA_ID_VIDEOSTEREOMODE 0x53B8
#define GST_MATROSKA_ID_VIDEOASPECTRATIOTYPE 0x54B3
#define GST_MATROSKA_ID_VIDEOCOLOURSPACE 0x2EB524
/* semi-draft */
#define GST_MATROSKA_ID_VIDEOGAMMAVALUE 0x2FB523
/* IDs in the TrackAudio master */
#define GST_MATROSKA_ID_AUDIOSAMPLINGFREQ 0xB5
#define GST_MATROSKA_ID_AUDIOBITDEPTH 0x6264
#define GST_MATROSKA_ID_AUDIOCHANNELS 0x9F
/* semi-draft */
#define GST_MATROSKA_ID_AUDIOCHANNELPOSITIONS 0x7D7B
#define GST_MATROSKA_ID_AUDIOOUTPUTSAMPLINGFREQ 0x78B5
/* IDs in the TrackContentEncoding master */
#define GST_MATROSKA_ID_CONTENTENCODING 0x6240
/* IDs in the ContentEncoding master */
#define GST_MATROSKA_ID_CONTENTENCODINGORDER 0x5031
#define GST_MATROSKA_ID_CONTENTENCODINGSCOPE 0x5032
#define GST_MATROSKA_ID_CONTENTENCODINGTYPE 0x5033
#define GST_MATROSKA_ID_CONTENTCOMPRESSION 0x5034
#define GST_MATROSKA_ID_CONTENTENCRYPTION 0x5035
/* IDs in the ContentCompression master */
#define GST_MATROSKA_ID_CONTENTCOMPALGO 0x4254
#define GST_MATROSKA_ID_CONTENTCOMPSETTINGS 0x4255
/* IDs in the ContentEncryption master */
#define GST_MATROSKA_ID_CONTENTENCALGO 0x47E1
#define GST_MATROSKA_ID_CONTENTENCKEYID 0x47E2
#define GST_MATROSKA_ID_CONTENTSIGNATURE 0x47E3
#define GST_MATROSKA_ID_CONTENTSIGKEYID 0x47E4
#define GST_MATROSKA_ID_CONTENTSIGALGO 0x47E5
#define GST_MATROSKA_ID_CONTENTSIGHASHALGO 0x47E6
/* ID in the CUEs master */
#define GST_MATROSKA_ID_POINTENTRY 0xBB
/* IDs in the pointentry master */
#define GST_MATROSKA_ID_CUETIME 0xB3
#define GST_MATROSKA_ID_CUETRACKPOSITIONS 0xB7
/* IDs in the CueTrackPositions master */
#define GST_MATROSKA_ID_CUETRACK 0xF7
#define GST_MATROSKA_ID_CUECLUSTERPOSITION 0xF1
#define GST_MATROSKA_ID_CUEBLOCKNUMBER 0x5378
/* semi-draft */
#define GST_MATROSKA_ID_CUECODECSTATE 0xEA
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFERENCE 0xDB
/* IDs in the CueReference master */
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFTIME 0x96
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFCLUSTER 0x97
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFNUMBER 0x535F
/* semi-draft */
#define GST_MATROSKA_ID_CUEREFCODECSTATE 0xEB
/* IDs in the Tags master */
#define GST_MATROSKA_ID_TAG 0x7373
/* in the Tag master */
#define GST_MATROSKA_ID_SIMPLETAG 0x67C8
#define GST_MATROSKA_ID_TARGETS 0x63C0
/* in the SimpleTag master */
#define GST_MATROSKA_ID_TAGNAME 0x45A3
#define GST_MATROSKA_ID_TAGSTRING 0x4487
#define GST_MATROSKA_ID_TAGLANGUAGE 0x447A
#define GST_MATROSKA_ID_TAGDEFAULT 0x4484
#define GST_MATROSKA_ID_TAGBINARY 0x4485
/* in the Targets master */
#define GST_MATROSKA_ID_TARGETTYPEVALUE 0x68CA
#define GST_MATROSKA_ID_TARGETTYPE 0x63CA
#define GST_MATROSKA_ID_TARGETTRACKUID 0x63C5
#define GST_MATROSKA_ID_TARGETEDITIONUID 0x63C9
#define GST_MATROSKA_ID_TARGETCHAPTERUID 0x63C4
#define GST_MATROSKA_ID_TARGETATTACHMENTUID 0x63C6
/* IDs in the SeekHead master */
#define GST_MATROSKA_ID_SEEKENTRY 0x4DBB
/* IDs in the SeekEntry master */
#define GST_MATROSKA_ID_SEEKID 0x53AB
#define GST_MATROSKA_ID_SEEKPOSITION 0x53AC
/* IDs in the Cluster master */
#define GST_MATROSKA_ID_CLUSTERTIMECODE 0xE7
#define GST_MATROSKA_ID_BLOCKGROUP 0xA0
#define GST_MATROSKA_ID_SIMPLEBLOCK 0xA3
#define GST_MATROSKA_ID_REFERENCEBLOCK 0xFB
#define GST_MATROSKA_ID_POSITION 0xA7
#define GST_MATROSKA_ID_PREVSIZE 0xAB
/* semi-draft */
#define GST_MATROSKA_ID_ENCRYPTEDBLOCK 0xAF
#define GST_MATROSKA_ID_SILENTTRACKS 0x5854
/* IDs in the SilentTracks master */
#define GST_MATROSKA_ID_SILENTTRACKNUMBER 0x58D7
/* IDs in the BlockGroup master */
#define GST_MATROSKA_ID_BLOCK 0xA1
#define GST_MATROSKA_ID_BLOCKDURATION 0x9B
/* semi-draft */
#define GST_MATROSKA_ID_BLOCKVIRTUAL 0xA2
#define GST_MATROSKA_ID_REFERENCEBLOCK 0xFB
#define GST_MATROSKA_ID_BLOCKADDITIONS 0x75A1
#define GST_MATROSKA_ID_REFERENCEPRIORITY 0xFA
/* semi-draft */
#define GST_MATROSKA_ID_REFERENCEVIRTUAL 0xFD
/* semi-draft */
#define GST_MATROSKA_ID_CODECSTATE 0xA4
#define GST_MATROSKA_ID_SLICES 0x8E
/* IDs in the BlockAdditions master */
#define GST_MATROSKA_ID_BLOCKMORE 0xA6
/* IDs in the BlockMore master */
#define GST_MATROSKA_ID_BLOCKADDID 0xEE
#define GST_MATROSKA_ID_BLOCKADDITIONAL 0xA5
/* IDs in the Slices master */
#define GST_MATROSKA_ID_TIMESLICE 0xE8
/* IDs in the TimeSlice master */
#define GST_MATROSKA_ID_LACENUMBER 0xCC
/* semi-draft */
#define GST_MATROSKA_ID_FRAMENUMBER 0xCD
/* semi-draft */
#define GST_MATROSKA_ID_BLOCKADDITIONID 0xCB
/* semi-draft */
#define GST_MATROSKA_ID_TIMESLICEDELAY 0xCE
#define GST_MATROSKA_ID_TIMESLICEDURATION 0xCF
/* IDs in the Attachments master */
#define GST_MATROSKA_ID_ATTACHEDFILE 0x61A7
/* IDs in the AttachedFile master */
#define GST_MATROSKA_ID_FILEDESCRIPTION 0x467E
#define GST_MATROSKA_ID_FILENAME 0x466E
#define GST_MATROSKA_ID_FILEMIMETYPE 0x4660
#define GST_MATROSKA_ID_FILEDATA 0x465C
#define GST_MATROSKA_ID_FILEUID 0x46AE
/* semi-draft */
#define GST_MATROSKA_ID_FILEREFERRAL 0x4675
/* IDs in the Chapters master */
#define GST_MATROSKA_ID_EDITIONENTRY 0x45B9
/* IDs in the EditionEntry master */
#define GST_MATROSKA_ID_EDITIONUID 0x45BC
#define GST_MATROSKA_ID_EDITIONFLAGHIDDEN 0x45BD
#define GST_MATROSKA_ID_EDITIONFLAGDEFAULT 0x45DB
#define GST_MATROSKA_ID_EDITIONFLAGORDERED 0x45DD
#define GST_MATROSKA_ID_CHAPTERATOM 0xB6
/* IDs in the ChapterAtom master */
#define GST_MATROSKA_ID_CHAPTERUID 0x73C4
#define GST_MATROSKA_ID_CHAPTERTIMESTART 0x91
#define GST_MATROSKA_ID_CHAPTERTIMESTOP 0x92
#define GST_MATROSKA_ID_CHAPTERFLAGHIDDEN 0x98
#define GST_MATROSKA_ID_CHAPTERFLAGENABLED 0x4598
#define GST_MATROSKA_ID_CHAPTERSEGMENTUID 0x6E67
#define GST_MATROSKA_ID_CHAPTERSEGMENTEDITIONUID 0x6EBC
#define GST_MATROSKA_ID_CHAPTERPHYSICALEQUIV 0x63C3
#define GST_MATROSKA_ID_CHAPTERTRACK 0x8F
#define GST_MATROSKA_ID_CHAPTERDISPLAY 0x80
#define GST_MATROSKA_ID_CHAPPROCESS 0x6944
/* IDs in the ChapProcess master */
#define GST_MATROSKA_ID_CHAPPROCESSCODECID 0x6955
#define GST_MATROSKA_ID_CHAPPROCESSPRIVATE 0x450D
#define GST_MATROSKA_ID_CHAPPROCESSCOMMAND 0x6911
/* IDs in the ChapProcessCommand master */
#define GST_MATROSKA_ID_CHAPPROCESSTIME 0x6922
#define GST_MATROSKA_ID_CHAPPROCESSDATA 0x6933
/* IDs in the ChapterDisplay master */
#define GST_MATROSKA_ID_CHAPSTRING 0x85
#define GST_MATROSKA_ID_CHAPLANGUAGE 0x437C
#define GST_MATROSKA_ID_CHAPCOUNTRY 0x437E
/* IDs in the ChapterTrack master */
#define GST_MATROSKA_ID_CHAPTERTRACKNUMBER 0x89
/*
* Matroska Codec IDs. Strings.
*/
#define GST_MATROSKA_CODEC_ID_VIDEO_VFW_FOURCC "V_MS/VFW/FOURCC"
#define GST_MATROSKA_CODEC_ID_VIDEO_UNCOMPRESSED "V_UNCOMPRESSED"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_SP "V_MPEG4/ISO/SP"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_ASP "V_MPEG4/ISO/ASP"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AP "V_MPEG4/ISO/AP"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG4_AVC "V_MPEG4/ISO/AVC"
#define GST_MATROSKA_CODEC_ID_VIDEO_MSMPEG4V3 "V_MPEG4/MS/V3"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG1 "V_MPEG1"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEG2 "V_MPEG2"
/* FIXME: not (yet) in the spec! */
#define GST_MATROSKA_CODEC_ID_VIDEO_MJPEG "V_MJPEG"
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO1 "V_REAL/RV10"
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO2 "V_REAL/RV20"
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO3 "V_REAL/RV30"
#define GST_MATROSKA_CODEC_ID_VIDEO_REALVIDEO4 "V_REAL/RV40"
#define GST_MATROSKA_CODEC_ID_VIDEO_THEORA "V_THEORA"
#define GST_MATROSKA_CODEC_ID_VIDEO_QUICKTIME "V_QUICKTIME"
#define GST_MATROSKA_CODEC_ID_VIDEO_SNOW "V_SNOW"
#define GST_MATROSKA_CODEC_ID_VIDEO_DIRAC "V_DIRAC"
#define GST_MATROSKA_CODEC_ID_VIDEO_VP8 "V_VP8"
#define GST_MATROSKA_CODEC_ID_VIDEO_VP9 "V_VP9"
#define GST_MATROSKA_CODEC_ID_VIDEO_MPEGH_HEVC "V_MPEGH/ISO/HEVC"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L1 "A_MPEG/L1"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L2 "A_MPEG/L2"
#define GST_MATROSKA_CODEC_ID_AUDIO_MPEG1_L3 "A_MPEG/L3"
#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_BE "A_PCM/INT/BIG"
#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_INT_LE "A_PCM/INT/LIT"
#define GST_MATROSKA_CODEC_ID_AUDIO_PCM_FLOAT "A_PCM/FLOAT/IEEE"
#define GST_MATROSKA_CODEC_ID_AUDIO_AC3 "A_AC3"
#define GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID9 "A_AC3/BSID9"
#define GST_MATROSKA_CODEC_ID_AUDIO_AC3_BSID10 "A_AC3/BSID10"
#define GST_MATROSKA_CODEC_ID_AUDIO_EAC3 "A_EAC3"
#define GST_MATROSKA_CODEC_ID_AUDIO_TRUEHD "A_TRUEHD"
#define GST_MATROSKA_CODEC_ID_AUDIO_DTS "A_DTS"
#define GST_MATROSKA_CODEC_ID_AUDIO_VORBIS "A_VORBIS"
#define GST_MATROSKA_CODEC_ID_AUDIO_FLAC "A_FLAC"
/* FIXME: not yet in the spec */
#define GST_MATROSKA_CODEC_ID_AUDIO_SPEEX "A_SPEEX"
#define GST_MATROSKA_CODEC_ID_AUDIO_ACM "A_MS/ACM"
#define GST_MATROSKA_CODEC_ID_AUDIO_TTA "A_TTA1"
#define GST_MATROSKA_CODEC_ID_AUDIO_WAVPACK4 "A_WAVPACK4"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_14_4 "A_REAL/14_4"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_28_8 "A_REAL/28_8"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_COOK "A_REAL/COOK"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_SIPR "A_REAL/SIPR"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_RALF "A_REAL/RALF"
#define GST_MATROSKA_CODEC_ID_AUDIO_REAL_ATRC "A_REAL/ATRC"
#define GST_MATROSKA_CODEC_ID_AUDIO_AAC "A_AAC"
#define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG2 "A_AAC/MPEG2/"
#define GST_MATROSKA_CODEC_ID_AUDIO_AAC_MPEG4 "A_AAC/MPEG4/"
#define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDMC "A_QUICKTIME/QDMC"
#define GST_MATROSKA_CODEC_ID_AUDIO_QUICKTIME_QDM2 "A_QUICKTIME/QDM2"
#define GST_MATROSKA_CODEC_ID_AUDIO_OPUS "A_OPUS"
/* Undefined for now:
#define GST_MATROSKA_CODEC_ID_AUDIO_MPC "A_MPC"
*/
#define GST_MATROSKA_CODEC_ID_SUBTITLE_ASCII "S_TEXT/ASCII"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_UTF8 "S_TEXT/UTF8"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_SSA "S_TEXT/SSA"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_ASS "S_TEXT/ASS"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_USF "S_TEXT/USF"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_VOBSUB "S_VOBSUB"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_HDMVPGS "S_HDMV/PGS"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_BMP "S_IMAGE/BMP"
#define GST_MATROSKA_CODEC_ID_SUBTITLE_KATE "S_KATE"
/*
* Matroska tags. Strings.
*/
#define GST_MATROSKA_TAG_ID_TITLE "TITLE"
#define GST_MATROSKA_TAG_ID_AUTHOR "AUTHOR"
#define GST_MATROSKA_TAG_ID_ARTIST "ARTIST"
#define GST_MATROSKA_TAG_ID_ALBUM "ALBUM"
#define GST_MATROSKA_TAG_ID_COMMENTS "COMMENTS"
#define GST_MATROSKA_TAG_ID_COMMENT "COMMENT"
#define GST_MATROSKA_TAG_ID_BITSPS "BITSPS"
#define GST_MATROSKA_TAG_ID_BPS "BPS"
#define GST_MATROSKA_TAG_ID_ENCODER "ENCODER"
#define GST_MATROSKA_TAG_ID_ISRC "ISRC"
#define GST_MATROSKA_TAG_ID_COPYRIGHT "COPYRIGHT"
#define GST_MATROSKA_TAG_ID_BPM "BPM"
#define GST_MATROSKA_TAG_ID_TERMS_OF_USE "TERMS_OF_USE"
#define GST_MATROSKA_TAG_ID_DATE "DATE"
#define GST_MATROSKA_TAG_ID_COMPOSER "COMPOSER"
#define GST_MATROSKA_TAG_ID_LEAD_PERFORMER "LEAD_PERFOMER"
#define GST_MATROSKA_TAG_ID_GENRE "GENRE"
#define GST_MATROSKA_TAG_ID_TOTAL_PARTS "TOTAL_PARTS"
#define GST_MATROSKA_TAG_ID_PART_NUMBER "PART_NUMBER"
#define GST_MATROSKA_TAG_ID_SUBTITLE "SUBTITLE"
#define GST_MATROSKA_TAG_ID_ACCOMPANIMENT "ACCOMPANIMENT"
#define GST_MATROSKA_TAG_ID_LYRICS "LYRICS"
#define GST_MATROSKA_TAG_ID_CONDUCTOR "CONDUCTOR"
#define GST_MATROSKA_TAG_ID_ENCODED_BY "ENCODED_BY"
#define GST_MATROSKA_TAG_ID_DESCRIPTION "DESCRIPTION"
#define GST_MATROSKA_TAG_ID_KEYWORDS "KEYWORDS"
#define GST_MATROSKA_TAG_ID_DATE_RELEASED "DATE_RELEASED"
#define GST_MATROSKA_TAG_ID_DATE_RECORDED "DATE_RECORDED"
#define GST_MATROSKA_TAG_ID_DATE_ENCODED "DATE_ENCODED"
#define GST_MATROSKA_TAG_ID_DATE_TAGGED "DATE_TAGGED"
#define GST_MATROSKA_TAG_ID_DATE_DIGITIZED "DATE_DIGITIZED"
#define GST_MATROSKA_TAG_ID_DATE_WRITTEN "DATE_WRITTEN"
#define GST_MATROSKA_TAG_ID_DATE_PURCHASED "DATE_PURCHASED"
#define GST_MATROSKA_TAG_ID_RECORDING_LOCATION "RECORDING_LOCATION"
#define GST_MATROSKA_TAG_ID_PRODUCTION_COPYRIGHT "PRODUCTION_COPYRIGHT"
#define GST_MATROSKA_TAG_ID_LICENSE "LICENSE"
/*
* TODO: add this tag & mappings
* "REPLAYGAIN_GAIN" -> GST_TAG_*_GAIN see http://replaygain.hydrogenaudio.org/rg_data_format.html
* "REPLAYGAIN_PEAK" -> GST_TAG_*_PEAK see http://replaygain.hydrogenaudio.org/peak_data_format.html
* both are depending on the target (track, album?)
*
* "TOTAL_PARTS" -> GST_TAG_TRACK_COUNT depending on target
* "PART_NUMBER" -> GST_TAG_TRACK_NUMBER depending on target
*
* "SORT_WITH" -> nested in other elements, GST_TAG_TITLE_SORTNAME, etc
*
* TODO: maybe add custom gstreamer tags for other standard matroska tags,
* see http://matroska.org/technical/specs/tagging/index.html
*
* TODO: handle tag targets and nesting correctly
*/
/*
* Enumerations for various types (mapping from binary
* value to what it actually means).
*/
typedef enum {
GST_MATROSKA_TRACK_TYPE_VIDEO = 0x1,
GST_MATROSKA_TRACK_TYPE_AUDIO = 0x2,
GST_MATROSKA_TRACK_TYPE_COMPLEX = 0x3,
GST_MATROSKA_TRACK_TYPE_LOGO = 0x10,
GST_MATROSKA_TRACK_TYPE_SUBTITLE = 0x11,
GST_MATROSKA_TRACK_TYPE_BUTTONS = 0x12,
GST_MATROSKA_TRACK_TYPE_CONTROL = 0x20,
} GstMatroskaTrackType;
typedef enum {
GST_MATROSKA_ASPECT_RATIO_MODE_FREE = 0x0,
GST_MATROSKA_ASPECT_RATIO_MODE_KEEP = 0x1,
GST_MATROSKA_ASPECT_RATIO_MODE_FIXED = 0x2,
} GstMatroskaAspectRatioMode;
/*
* These aren't in any way "matroska-form" things,
* it's just something I use in the muxer/demuxer.
*/
typedef enum {
GST_MATROSKA_TRACK_ENABLED = (1<<0),
GST_MATROSKA_TRACK_DEFAULT = (1<<1),
GST_MATROSKA_TRACK_LACING = (1<<2),
GST_MATROSKA_TRACK_FORCED = (1<<3),
GST_MATROSKA_TRACK_SHIFT = (1<<16)
} GstMatroskaTrackFlags;
typedef enum {
GST_MATROSKA_VIDEOTRACK_INTERLACED = (GST_MATROSKA_TRACK_SHIFT<<0)
} GstMatroskaVideoTrackFlags;
typedef struct _GstMatroskaTrackContext GstMatroskaTrackContext;
/* TODO: check if all fields are used */
struct _GstMatroskaTrackContext {
GstPad *pad;
GstCaps *caps;
guint index;
/* reverse playback */
GstClockTime from_time;
gint64 from_offset;
gint64 to_offset;
GArray *index_table;
gint index_writer_id;
/* some often-used info */
guint64 track_uid;
gchar *codec_id, *codec_name, *name, *language;
gpointer codec_priv;
gsize codec_priv_size;
gpointer codec_state;
gsize codec_state_size;
GstMatroskaTrackType type;
guint64 uid, num;
GstMatroskaTrackFlags flags;
guint64 default_duration;
guint64 pos;
gdouble timecodescale;
gboolean set_discont; /* TRUE = set DISCONT flag on next buffer */
/* Stream header buffer, to put into caps and send before any other buffers */
GstBufferList * stream_headers;
gboolean send_stream_headers;
/* Special flag for VobSub, for which we have to send colour table info
* (if available) first before sending any data, and just testing
* for time == 0 is not enough to detect that. Used by demuxer */
gboolean send_dvd_event;
/* Special counter for muxer to skip the first N vorbis/theora headers -
* they are put into codec private data, not muxed into the stream */
guint xiph_headers_to_skip;
/* Used for postprocessing a frame before it is pushed from the demuxer */
GstFlowReturn (*postprocess_frame) (GstElement *element,
GstMatroskaTrackContext *context,
GstBuffer **buffer);
/* List of tags for this stream */
GstTagList *tags;
/* Tags changed and should be pushed again */
gboolean tags_changed;
/* A GArray of GstMatroskaTrackEncoding structures which contain the
* encoding (compression/encryption) settings for this track, if any */
GArray *encodings;
/* Whether the stream is EOS */
gboolean eos;
/* any alignment we need our output buffers to have */
gint alignment;
/* for compatibility with VFW files, where timestamp represents DTS */
gboolean dts_only;
/* indicate that the track is raw (jpeg,raw variants) and so pts=dts */
gboolean intra_only;
};
typedef struct _GstMatroskaTrackVideoContext {
GstMatroskaTrackContext parent;
guint pixel_width, pixel_height;
guint display_width, display_height;
gdouble default_fps;
GstMatroskaAspectRatioMode asr_mode;
guint32 fourcc;
/* QoS */
GstClockTime earliest_time;
GstBuffer *dirac_unit;
} GstMatroskaTrackVideoContext;
typedef struct _GstMatroskaTrackAudioContext {
GstMatroskaTrackContext parent;
guint samplerate, channels, bitdepth;
guint32 wvpk_block_index;
} GstMatroskaTrackAudioContext;
typedef struct _GstMatroskaTrackSubtitleContext {
GstMatroskaTrackContext parent;
gboolean check_utf8; /* buffers should be valid UTF-8 */
gboolean check_markup; /* check if buffers contain markup
* or plaintext and escape characters */
gboolean invalid_utf8; /* work around broken files */
gboolean seen_markup_tag; /* markup found in text */
} GstMatroskaTrackSubtitleContext;
typedef struct _GstMatroskaIndex {
guint64 pos; /* of the corresponding *cluster*! */
guint16 track; /* reference to 'num' */
GstClockTime time; /* in nanoseconds */
guint32 block; /* number of the block in the cluster */
} GstMatroskaIndex;
typedef struct _Wavpack4Header {
guchar ck_id [4]; /* "wvpk" */
guint32 ck_size; /* size of entire frame (minus 8, of course) */
guint16 version; /* 0x403 for now */
guint8 track_no; /* track number (0 if not used, like now) */
guint8 index_no; /* remember these? (0 if not used, like now) */
guint32 total_samples; /* for entire file (-1 if unknown) */
guint32 block_index; /* index of first sample in block (to file begin) */
guint32 block_samples; /* # samples in this block */
guint32 flags; /* various flags for id and decoding */
guint32 crc; /* crc for actual decoded data */
} Wavpack4Header;
typedef enum {
GST_MATROSKA_TRACK_ENCODING_SCOPE_FRAME = (1<<0),
GST_MATROSKA_TRACK_ENCODING_SCOPE_CODEC_DATA = (1<<1),
GST_MATROSKA_TRACK_ENCODING_SCOPE_NEXT_CONTENT_ENCODING = (1<<2)
} GstMatroskaTrackEncodingScope;
typedef enum {
GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_ZLIB = 0,
GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_BZLIB = 1,
GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_LZO1X = 2,
GST_MATROSKA_TRACK_COMPRESSION_ALGORITHM_HEADERSTRIP = 3
} GstMatroskaTrackCompressionAlgorithm;
typedef struct _GstMatroskaTrackEncoding {
guint order;
guint scope : 3;
guint type : 1;
guint comp_algo : 2;
guint8 *comp_settings;
guint comp_settings_length;
} GstMatroskaTrackEncoding;
gboolean gst_matroska_track_init_video_context (GstMatroskaTrackContext ** p_context);
gboolean gst_matroska_track_init_audio_context (GstMatroskaTrackContext ** p_context);
gboolean gst_matroska_track_init_subtitle_context (GstMatroskaTrackContext ** p_context);
void gst_matroska_register_tags (void);
GstBufferList * gst_matroska_parse_xiph_stream_headers (gpointer codec_data,
gsize codec_data_size);
GstBufferList * gst_matroska_parse_speex_stream_headers (gpointer codec_data,
gsize codec_data_size);
GstBufferList * gst_matroska_parse_opus_stream_headers (gpointer codec_data,
gsize codec_data_size);
GstBufferList * gst_matroska_parse_flac_stream_headers (gpointer codec_data,
gsize codec_data_size);
void gst_matroska_track_free (GstMatroskaTrackContext * track);
GstClockTime gst_matroska_track_get_buffer_timestamp (GstMatroskaTrackContext * track, GstBuffer *buf);
#endif /* __GST_MATROSKA_IDS_H__ */