stream-deploy/ZLM/3rdpart/media-server/libmkv/src/mkv-internal.h

249 lines
4.9 KiB
C++

#ifndef _mkv_internal_h_
#define _mkv_internal_h_
#include "ebml.h"
#include "mkv-buffer.h"
#include "mkv-format.h"
#include "mkv-ioutil.h"
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <stdio.h>
#include <errno.h>
enum
{
MKV_TRACK_VIDEO = 1,
MKV_TRACK_AUDIO = 2,
MKV_TRACK_COMPLEX = 3,
MKV_TRACK_LOGO = 16,
MKV_TRACK_SUBTITLE = 17,
MKV_TRACK_BUTTONS = 18,
MKV_TRACK_CONTROL = 32,
MKV_TRACK_METADATA = 33,
};
#define EBML_ID_EBML 0x1A45DFA3
#define EBML_ID_SEGMENT 0x18538067
#define EBML_ID_SEEK 0x114D9B74
#define EBML_ID_INFO 0x1549A966
#define EBML_ID_TRACKS 0x1654AE6B
#define EBML_ID_CLUSTER 0x1F43B675
#define EBML_ID_CUES 0x1C53BB6B
#define EBML_ID_TAGS 0x1254C367
#define EBML_ID_CHAPTERS 0x1043A770
#define EBML_ID_ATTACHMENTS 0x1941A469
#define EMLB_ID_VOID 0xEC
struct ebml_binary_t
{
void* ptr;
size_t len;
};
struct mkv_segment_seek_t
{
int64_t info;
int64_t tracks;
int64_t chapters;
int64_t attachments;
int64_t tags;
int64_t cluster;
int64_t cues;
};
struct mkv_segment_info_t
{
struct ebml_binary_t uid;
uint64_t date; // utc
uint64_t timescale;
double duration;
};
struct mkv_video_track_t
{
int alpha;
unsigned int width;
unsigned int height;
unsigned int aspect_ratio_type;
double gamma;
double fps;
};
struct mkv_audio_track_t
{
double sampling; // frequency
unsigned int channels;
unsigned int bits;
};
struct mkv_block_addition_t
{
uint64_t id;
struct ebml_binary_t addition;
};
struct mkv_block_slice_t
{
uint64_t lace;
uint64_t frame;
uint64_t addition;
uint64_t delay;
uint64_t duration;
};
struct mkv_block_group_t
{
struct ebml_binary_t block;
uint64_t duration;
int codec_state;
struct mkv_block_addition_t* additions;
size_t addition_count, addition_capacity;
struct mkv_block_slice_t* slices;
size_t slice_count, slice_capacity;
};
struct mkv_sample_t
{
int track;
int flags; // 1-keyframe
int64_t dts;
int64_t pts;
uint32_t bytes;
uint64_t offset;
void* data;
};
struct mkv_cluster_t
{
uint64_t timestamp;
uint64_t position;
uint64_t prev_size;
struct mkv_block_group_t* groups;
size_t count, capacity;
};
struct mkv_chapter_t
{
uint64_t uid;
int flag_hidden;
int flag_default;
int flag_ordered;
};
struct mkv_tag_simple_t
{
char* name;
char* lang;
char* string;
};
struct mkv_tag_t
{
char* target_type;
uint64_t target_type_value;
struct mkv_tag_simple_t* simples;
size_t count, capacity;
};
struct mkv_cue_position_t
{
uint64_t track;
uint64_t cluster;
uint64_t relative;
uint64_t duration;
uint64_t timestamp; // Absolute timestamp according to the Segment time base.
uint64_t block; // default 1
int flag_codec_state; // codec state, default 0
};
struct mkv_cue_t
{
struct mkv_cue_position_t* positions;
size_t count, capacity;
};
struct mkv_track_t
{
uint64_t uid;
unsigned int id;
unsigned int media;
int flag_enabled;
int flag_default;
int flag_lacing;
int flag_forced;
int64_t first_ts;
int64_t last_ts;
int64_t sample_count;
// Number of nanoseconds (not scaled via TimestampScale) per frame
// (frame in the Matroska sense -- one Element put into a (Simple)Block).
uint64_t duration;
int64_t offset;
enum mkv_codec_t codecid;
char* name;
char* lang; // default eng
struct ebml_binary_t codec_extra;
union
{
struct mkv_video_track_t video;
struct mkv_audio_track_t audio;
} u;
};
struct mkv_t
{
char doc[16];
struct mkv_track_t* tracks;
int track_count;
double duration;
uint64_t timescale; // Timestamp scale in nanoseconds
struct mkv_cluster_t *cluster;
struct mkv_cue_t cue;
struct mkv_segment_seek_t seek;
struct mkv_sample_t* samples; // cache, read only
int count, capacity;
struct
{
int* raps; // keyframe index
int count, capacity;
} rap;
};
#define FREE(ptr) {void* p = (ptr); if(p) free(p); }
struct mkv_track_t* mkv_track_find(struct mkv_t* mkv, unsigned int id);
struct mkv_track_t* mkv_add_track(struct mkv_t* mkv);
int mkv_track_free(struct mkv_track_t* track);
int mkv_write_track(struct mkv_ioutil_t* io, struct mkv_track_t* track);
int mkv_add_video(struct mkv_track_t* track, enum mkv_codec_t codec, int width, int height, const void* extra_data, size_t extra_data_size);
int mkv_add_audio(struct mkv_track_t* track, enum mkv_codec_t codec, int channel_count, int bits_per_sample, int sample_rate, const void* extra_data, size_t extra_data_size);
int mkv_add_subtitle(struct mkv_track_t* track, enum mkv_codec_t codec, const void* extra_data, size_t extra_data_size);
int mkv_cluster_simple_block_read(struct mkv_t* mkv, struct mkv_cluster_t* cluster, struct mkv_ioutil_t* io, int64_t bytes);
int mkv_cluster_simple_block_write(struct mkv_t* mkv, struct mkv_sample_t* sample, struct mkv_ioutil_t* io);
int mkv_cue_add(struct mkv_t* mkv, int track, int64_t timestamp, uint64_t cluster, uint64_t relative);
void mkv_write_cues(struct mkv_ioutil_t* io, struct mkv_t* mkv);
void mkv_write_size(const struct mkv_ioutil_t* io, uint64_t offset, uint32_t size);
#endif /* !_mkv_internal_h_ */