compression.h
/*****************************************************************
* gavl - a general purpose audio/video processing library
*
* Copyright (c) 2001 - 2024 Members of the Gmerlin project
* http://github.com/bplaum
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
* *****************************************************************/
#ifndef GAVL_COMPRESSION_H_INCLUDED
#define GAVL_COMPRESSION_H_INCLUDED
#include <gavl/gavldefs.h>
#include <gavl/value.h>
#ifdef __cplusplus
extern "C" {
#endif
typedef struct gavl_io_s gavl_io_t;
#define GAVL_COMPRESSION_HAS_P_FRAMES (1<<0)
#define GAVL_COMPRESSION_HAS_B_FRAMES (1<<1)
#define GAVL_COMPRESSION_HAS_FIELD_PICTURES (1<<2)
#define GAVL_COMPRESSION_SBR (1<<3)
#define GAVL_COMPRESSION_BIG_ENDIAN (1<<4)
#define GAVL_MK_FOURCC(a, b, c, d) ((a<<24)|(b<<16)|(c<<8)|d)
typedef struct gavl_compression_info_s gavl_compression_info_t;
typedef enum
{
GAVL_CODEC_ID_NONE = 0,
/* Audio */
GAVL_CODEC_ID_ALAW = 1,
GAVL_CODEC_ID_ULAW,
GAVL_CODEC_ID_MP2,
GAVL_CODEC_ID_MP3,
GAVL_CODEC_ID_AC3,
GAVL_CODEC_ID_AAC,
GAVL_CODEC_ID_VORBIS,
GAVL_CODEC_ID_FLAC,
GAVL_CODEC_ID_OPUS,
GAVL_CODEC_ID_SPEEX,
GAVL_CODEC_ID_DTS,
/* Video */
GAVL_CODEC_ID_JPEG = 0x10000,
GAVL_CODEC_ID_PNG,
GAVL_CODEC_ID_TIFF,
GAVL_CODEC_ID_TGA,
GAVL_CODEC_ID_MPEG1,
GAVL_CODEC_ID_MPEG2,
GAVL_CODEC_ID_MPEG4_ASP,
GAVL_CODEC_ID_H264,
GAVL_CODEC_ID_THEORA,
GAVL_CODEC_ID_DIRAC,
GAVL_CODEC_ID_DV,
GAVL_CODEC_ID_VP8,
GAVL_CODEC_ID_DIV3,
/* Subtitle (some video codecs can handle subtitles also */
GAVL_CODEC_ID_DVDSUB = 0x20000,
GAVL_CODEC_ID_EXTENDED = 0xffffffff,
} gavl_codec_id_t;
#define GAVL_BITRATE_VBR -1
#define GAVL_BITRATE_LOSSLESS -2
struct gavl_compression_info_s
{
int flags;
gavl_codec_id_t id;
gavl_buffer_t codec_header;
int bitrate;
int palette_size;
int pre_skip;
int video_buffer_size;
uint32_t codec_tag;
int block_align; // Needed by MS audio codecs
};
GAVL_PUBLIC
void gavl_compression_info_init(gavl_compression_info_t * info);
GAVL_PUBLIC
void gavl_compression_info_free(gavl_compression_info_t* info);
GAVL_PUBLIC
void gavl_compression_info_dump(const gavl_compression_info_t * info);
GAVL_PUBLIC
void gavl_compression_info_dumpi(const gavl_compression_info_t * info, int num);
GAVL_PUBLIC
void gavl_compression_info_copy(gavl_compression_info_t * dst,
const gavl_compression_info_t * src);
GAVL_PUBLIC
void gavl_compression_info_set_global_header(gavl_compression_info_t * dst,
const uint8_t * data, int len);
GAVL_PUBLIC
void gavl_compression_info_append_global_header(gavl_compression_info_t * dst,
const uint8_t * data, int len);
GAVL_PUBLIC
void gavl_append_xiph_header(gavl_buffer_t * codec_header,
uint8_t * header,
int header_len);
GAVL_PUBLIC
uint8_t * gavl_extract_xiph_header(gavl_buffer_t * codec_header,
int idx,
int * header_len);
GAVL_PUBLIC
const char * gavl_compression_get_extension(gavl_codec_id_t id, int * separate);
GAVL_PUBLIC
int gavl_compression_need_pixelformat(gavl_codec_id_t id);
const char * gavl_compression_get_mimetype(const gavl_compression_info_t * ci);
GAVL_PUBLIC
int gavl_compression_constant_frame_samples(gavl_codec_id_t id);
GAVL_PUBLIC
int gavl_compression_get_sample_size(gavl_codec_id_t id);
GAVL_PUBLIC const char *
gavl_compression_get_long_name(gavl_codec_id_t id);
GAVL_PUBLIC const char *
gavl_compression_get_short_name(gavl_codec_id_t id);
GAVL_PUBLIC gavl_codec_id_t
gavl_compression_from_short_name(const char * name);
GAVL_PUBLIC
int gavl_num_compressions(void);
GAVL_PUBLIC
gavl_codec_id_t gavl_get_compression(int index);
#define GAVL_PACKET_TYPE_I 0x01
#define GAVL_PACKET_TYPE_P 0x02
#define GAVL_PACKET_TYPE_B 0x03
#define GAVL_PACKET_TYPE_MASK 0x03
#define GAVL_PACKET_KEYFRAME (1<<2)
#define GAVL_PACKET_LAST (1<<3)
#define GAVL_PACKET_EXT (1<<4)
#define GAVL_PACKET_REF (1<<5)
#define GAVL_PACKET_NOOUTPUT (1<<6)
#define GAVL_PACKET_HAS_FDS (1<<7)
#define GAVL_PACKET_FIELD_PIC (1<<8)
#define GAVL_PACKET_SKIP (1<<9)
#define GAVL_PACKET_FLAG_PRIV (1<<16)
#define GAVL_PACKET_FLAG_PUBLIC_MASK 0x0000ffff
#define GAVL_PACKET_FLAG_PRIVATE_MASK 0xffff0000
#define GAVL_PACKET_PADDING 32
GAVL_PUBLIC
const char * gavl_coding_type_to_string(int flags);
/* Extra data which can carried within a packet */
typedef enum
{
GAVL_PACKET_EXTRADATA_NONE = 0,
GAVL_PACKET_EXTRADATA_PALETTE,
GAVL_PACKET_EXTRADATA_FDS,
} gavl_packet_extradata_type_t;
#define GAVL_PACKET_MAX_EXTRADATA 2
typedef struct
{
int fds[GAVL_MAX_PLANES];
int num_fds;
} gavl_packet_fds_t;
typedef struct
{
uint16_t r;
uint16_t g;
uint16_t b;
uint16_t a;
}
gavl_palette_entry_t;
typedef struct
{
gavl_palette_entry_t * entries;
int num_entries;
} gavl_palette_t;
GAVL_PUBLIC gavl_palette_t *
gavl_palette_create(void);
GAVL_PUBLIC void
gavl_palette_alloc(gavl_palette_t * pal, int num_colors);
GAVL_PUBLIC void
gavl_palette_init(gavl_palette_t * pal);
GAVL_PUBLIC void
gavl_palette_free(gavl_palette_t * pal);
GAVL_PUBLIC void
gavl_palette_destroy(gavl_palette_t * pal);
GAVL_PUBLIC void
gavl_palette_move(gavl_palette_t * dst, gavl_palette_t * src);
typedef struct
{
gavl_packet_extradata_type_t type;
void * data;
} gavl_packet_extradata_t;
typedef struct gavl_packet_s
{
gavl_buffer_t buf;
uint32_t flags;
int64_t position;
int64_t pts;
int64_t dts;
int64_t pes_pts;
int64_t duration;
uint32_t field2_offset;
uint32_t header_size;
uint32_t sequence_end_pos;
gavl_interlace_mode_t interlace_mode;
gavl_timecode_t timecode;
gavl_rectangle_i_t src_rect;
int32_t dst_x;
int32_t dst_y;
int32_t id;
int buf_idx;
gavl_packet_extradata_t ext_data[GAVL_PACKET_MAX_EXTRADATA];
// int fds[GAVL_MAX_PLANES];
// int num_fds;
} gavl_packet_t;
GAVL_PUBLIC
void gavl_packet_init(gavl_packet_t * p);
GAVL_PUBLIC
gavl_packet_t * gavl_packet_create(void);
GAVL_PUBLIC
void gavl_packet_destroy(gavl_packet_t * p);
GAVL_PUBLIC
void gavl_packet_alloc(gavl_packet_t * p, int len);
GAVL_PUBLIC
void gavl_packet_free(gavl_packet_t * p);
GAVL_PUBLIC
void * gavl_packet_add_extradata(gavl_packet_t * p, gavl_packet_extradata_type_t type);
GAVL_PUBLIC
void * gavl_packet_get_extradata(gavl_packet_t * p, gavl_packet_extradata_type_t type);
/* Merge two consecutive fields into one */
GAVL_PUBLIC
void gavl_packet_merge_field2(gavl_packet_t * p, const gavl_packet_t * field2);
GAVL_PUBLIC
void gavl_packet_copy(gavl_packet_t * dst,
const gavl_packet_t * src);
GAVL_PUBLIC
void gavl_packet_copy_metadata(gavl_packet_t * dst,
const gavl_packet_t * src);
GAVL_PUBLIC
void gavl_packet_reset(gavl_packet_t * p);
GAVL_PUBLIC
void gavl_packet_dump(const gavl_packet_t * p);
GAVL_PUBLIC
void gavl_packet_save(const gavl_packet_t * p,
const char * filename);
typedef struct
{
int32_t size_min;
int32_t size_max;
int64_t duration_min;
int64_t duration_max;
int64_t pts_start;
int64_t pts_end;
int64_t total_bytes; // For average bitrate
int64_t total_packets; // For average framerate
} gavl_stream_stats_t;
GAVL_PUBLIC
void gavl_stream_stats_init(gavl_stream_stats_t*);
GAVL_PUBLIC
void gavl_stream_stats_dump(const gavl_stream_stats_t*, int indent);
GAVL_PUBLIC
void gavl_stream_stats_update(gavl_stream_stats_t*,const gavl_packet_t*p);
GAVL_PUBLIC
void gavl_stream_stats_update_end(gavl_stream_stats_t * f, const gavl_packet_t * p);
GAVL_PUBLIC
void gavl_stream_stats_update_params(gavl_stream_stats_t * f,
int64_t pts, int64_t duration, int data_len,
int flags);
GAVL_PUBLIC
void gavl_stream_stats_apply_audio(gavl_stream_stats_t * f,
const gavl_audio_format_t * fmt,
gavl_compression_info_t * ci,
gavl_dictionary_t * m);
GAVL_PUBLIC
void gavl_stream_stats_apply_video(gavl_stream_stats_t * f,
gavl_video_format_t * fmt,
gavl_compression_info_t * ci,
gavl_dictionary_t * m);
GAVL_PUBLIC
void gavl_stream_stats_apply_subtitle(gavl_stream_stats_t * f,
gavl_dictionary_t * m);
GAVL_PUBLIC
void gavl_stream_stats_apply_generic(gavl_stream_stats_t * f,
gavl_compression_info_t * ci,
gavl_dictionary_t * m);
GAVL_PUBLIC
int gavl_stream_get_stats(const gavl_dictionary_t * s, gavl_stream_stats_t * stats);
GAVL_PUBLIC
void gavl_stream_set_stats(gavl_dictionary_t * s, const gavl_stream_stats_t * stats);
/* PTS Cache */
typedef struct gavl_packet_pts_cache_s gavl_packet_pts_cache_t;
GAVL_PUBLIC
gavl_packet_pts_cache_t * gavl_packet_pts_cache_create(int size);
GAVL_PUBLIC
void gavl_packet_pts_cache_destroy(gavl_packet_pts_cache_t *);
GAVL_PUBLIC
void gavl_packet_pts_cache_push_packet(gavl_packet_pts_cache_t *m, const gavl_packet_t * pkt);
GAVL_PUBLIC
void gavl_packet_pts_cache_push_frame(gavl_packet_pts_cache_t *m, const gavl_video_frame_t * f);
GAVL_PUBLIC
int gavl_packet_pts_cache_get_first(gavl_packet_pts_cache_t *m, gavl_video_frame_t * f);
GAVL_PUBLIC
int gavl_packet_pts_cache_get_by_pts(gavl_packet_pts_cache_t *m, gavl_packet_t * pkt,
int64_t pts);
GAVL_PUBLIC
void gavl_packet_pts_cache_clear(gavl_packet_pts_cache_t *m);
#ifdef __cplusplus
}
#endif
#endif // GAVL_COMPRESSION_H_INCLUDED
gavl_compression_info_dump
GAVL_PUBLIC void gavl_compression_info_dump(const gavl_compression_info_t *info)
Dump a compression info to stderr.
gavl_packet_dump
GAVL_PUBLIC void gavl_packet_dump(const gavl_packet_t *p)
Dump a packet to stderr.
gavl_compression_need_pixelformat
GAVL_PUBLIC int gavl_compression_need_pixelformat(gavl_codec_id_t id)
Check if the compression supports multiple pixelformats.
gavl_compression_info_dumpi
GAVL_PUBLIC void gavl_compression_info_dumpi(const gavl_compression_info_t *info, int num)
Dump a compression info to stderr.
gavl_num_compressions
GAVL_PUBLIC int gavl_num_compressions(void)
Get the number of compression formats.
gavl_get_compression
GAVL_PUBLIC gavl_codec_id_t gavl_get_compression(int index)
Get a compression format for a specified index.
gavl_packet_copy_metadata
GAVL_PUBLIC void gavl_packet_copy_metadata(gavl_packet_t *dst, const gavl_packet_t *src)
Copy metadata of a packet.
gavl_packet_reset
GAVL_PUBLIC void gavl_packet_reset(gavl_packet_t *p)
Reset a packet.
gavl_compression_get_extension
GAVL_PUBLIC const char * gavl_compression_get_extension(gavl_codec_id_t id, int *separate)
Get the file extension of the corresponding raw format.
gavl_codec_id_t
gavl_codec_id_t
Codec ID.
Definition compression.h:79
gavl_compression_info_init
GAVL_PUBLIC void gavl_compression_info_init(gavl_compression_info_t *info)
Initialize a compression info.
gavl_compression_get_sample_size
GAVL_PUBLIC int gavl_compression_get_sample_size(gavl_codec_id_t id)
Check if an audio compression size for each samples.
gavl_packet_free
GAVL_PUBLIC void gavl_packet_free(gavl_packet_t *p)
Free memory of a packet.
gavl_packet_alloc
GAVL_PUBLIC void gavl_packet_alloc(gavl_packet_t *p, int len)
Allocate memory for a packet.
gavl_packet_copy
GAVL_PUBLIC void gavl_packet_copy(gavl_packet_t *dst, const gavl_packet_t *src)
Copy a packet.
gavl_compression_from_short_name
GAVL_PUBLIC gavl_codec_id_t gavl_compression_from_short_name(const char *name)
Get a compression from the short name.
gavl_compression_info_copy
GAVL_PUBLIC void gavl_compression_info_copy(gavl_compression_info_t *dst, const gavl_compression_info_t *src)
Copy a compression info.
gavl_packet_save
GAVL_PUBLIC void gavl_packet_save(const gavl_packet_t *p, const char *filename)
Save a packet to a file.
gavl_extract_xiph_header
GAVL_PUBLIC uint8_t * gavl_extract_xiph_header(gavl_buffer_t *codec_header, int idx, int *header_len)
Extract a Xiph packet to a global header.
gavl_compression_get_long_name
GAVL_PUBLIC const char * gavl_compression_get_long_name(gavl_codec_id_t id)
Return the long name of the compression.
gavl_compression_constant_frame_samples
GAVL_PUBLIC int gavl_compression_constant_frame_samples(gavl_codec_id_t id)
Check if an audio compression constant frame samples.
gavl_packet_init
GAVL_PUBLIC void gavl_packet_init(gavl_packet_t *p)
Initialize a packet.
gavl_append_xiph_header
GAVL_PUBLIC void gavl_append_xiph_header(gavl_buffer_t *codec_header, uint8_t *header, int header_len)
Append a Xiph packet to a global header.
gavl_compression_info_free
GAVL_PUBLIC void gavl_compression_info_free(gavl_compression_info_t *info)
Free all dynamically allocated memory of a compression info.
gavl_compression_get_short_name
GAVL_PUBLIC const char * gavl_compression_get_short_name(gavl_codec_id_t id)
Return the short name of the compression.
gavl_compression_get_mimetype
const char * gavl_compression_get_mimetype(const gavl_compression_info_t *ci)
Get the mimetype for the corresponding elementary format.
GAVL_CODEC_ID_VORBIS
@ GAVL_CODEC_ID_VORBIS
Vorbis (segmented extradata and packets).
Definition compression.h:92
GAVL_CODEC_ID_SPEEX
@ GAVL_CODEC_ID_SPEEX
Speex.
Definition compression.h:95
GAVL_CODEC_ID_DTS
@ GAVL_CODEC_ID_DTS
DTS.
Definition compression.h:96
GAVL_CODEC_ID_MPEG1
@ GAVL_CODEC_ID_MPEG1
MPEG-1 video.
Definition compression.h:103
GAVL_CODEC_ID_DV
@ GAVL_CODEC_ID_DV
DV (several variants).
Definition compression.h:109
GAVL_CODEC_ID_AC3
@ GAVL_CODEC_ID_AC3
AC3.
Definition compression.h:90
GAVL_CODEC_ID_DIRAC
@ GAVL_CODEC_ID_DIRAC
Complete DIRAC frames, sequence end code appended to last packet.
Definition compression.h:108
GAVL_CODEC_ID_TGA
@ GAVL_CODEC_ID_TGA
TGA image.
Definition compression.h:102
GAVL_CODEC_ID_MPEG2
@ GAVL_CODEC_ID_MPEG2
MPEG-2 video.
Definition compression.h:104
GAVL_CODEC_ID_AAC
@ GAVL_CODEC_ID_AAC
AAC as stored in quicktime/mp4.
Definition compression.h:91
GAVL_CODEC_ID_VP8
@ GAVL_CODEC_ID_VP8
VP8 (as used in webm).
Definition compression.h:110
GAVL_CODEC_ID_MPEG4_ASP
@ GAVL_CODEC_ID_MPEG4_ASP
MPEG-4 ASP (a.k.a. Divx4).
Definition compression.h:105
GAVL_CODEC_ID_JPEG
@ GAVL_CODEC_ID_JPEG
JPEG image.
Definition compression.h:99
GAVL_CODEC_ID_H264
@ GAVL_CODEC_ID_H264
H.264 (Annex B).
Definition compression.h:106
GAVL_CODEC_ID_MP2
@ GAVL_CODEC_ID_MP2
MPEG-1 audio layer II.
Definition compression.h:88
GAVL_CODEC_ID_TIFF
@ GAVL_CODEC_ID_TIFF
TIFF image.
Definition compression.h:101
GAVL_CODEC_ID_FLAC
@ GAVL_CODEC_ID_FLAC
Flac (extradata contain a file header without comment and seektable).
Definition compression.h:93
GAVL_CODEC_ID_THEORA
@ GAVL_CODEC_ID_THEORA
Theora (segmented extradata).
Definition compression.h:107
GAVL_CODEC_ID_DIV3
@ GAVL_CODEC_ID_DIV3
Old style Divx (aka MSMPEG4V3).
Definition compression.h:111
GAVL_CODEC_ID_MP3
@ GAVL_CODEC_ID_MP3
MPEG-1/2 audio layer 3 CBR/VBR.
Definition compression.h:89
GAVL_CODEC_ID_DVDSUB
@ GAVL_CODEC_ID_DVDSUB
DVD subtitles, palette is in header.
Definition compression.h:114
GAVL_CODEC_ID_PNG
@ GAVL_CODEC_ID_PNG
PNG image.
Definition compression.h:100
GAVL_CODEC_ID_ALAW
@ GAVL_CODEC_ID_ALAW
alaw 2:1
Definition compression.h:86
GAVL_CODEC_ID_NONE
@ GAVL_CODEC_ID_NONE
Unknown/unsupported compression format. In gavf files this signals that the stream consists of uncomp...
Definition compression.h:84
GAVL_CODEC_ID_OPUS
@ GAVL_CODEC_ID_OPUS
Opus.
Definition compression.h:94
GAVL_CODEC_ID_EXTENDED
@ GAVL_CODEC_ID_EXTENDED
Separate compression id.
Definition compression.h:115
GAVL_CODEC_ID_ULAW
@ GAVL_CODEC_ID_ULAW
mu-law 2:1
Definition compression.h:87
gavl_timecode_t
uint64_t gavl_timecode_t
Typedef for timecodes.
Definition timecode.h:44
gavl_video_format_t
struct gavl_video_format_s gavl_video_format_t
Video format.
Definition gavl.h:102
gavl_interlace_mode_t
gavl_interlace_mode_t
Interlace mode.
Definition gavl.h:2331
GAVL_MAX_PLANES
#define GAVL_MAX_PLANES
Definition gavl.h:1433
gavl_audio_format_t
Audio Format.
Definition gavl.h:273
gavl_compression_info_s
Compression format.
Definition compression.h:133
gavl_compression_info_s::pre_skip
int pre_skip
Samples to skip at the start.
Definition compression.h:141
gavl_compression_info_s::id
gavl_codec_id_t id
Codec ID.
Definition compression.h:135
gavl_compression_info_s::bitrate
int bitrate
Needed by some codecs, negative values mean VBR.
Definition compression.h:139
gavl_compression_info_s::codec_header
gavl_buffer_t codec_header
Global header.
Definition compression.h:137
gavl_compression_info_s::palette_size
int palette_size
Size of the embedded palette for image codecs.
Definition compression.h:140
gavl_compression_info_s::video_buffer_size
int video_buffer_size
VBV buffer size for video (in BYTES).
Definition compression.h:143
gavl_compression_info_s::flags
int flags
ORed combination of GAVL_COMPRESSION_* flags.
Definition compression.h:134
gavl_packet_extradata_t
Definition compression.h:408
gavl_packet_fds_t
Definition compression.h:369
gavl_packet_s
Packet structure.
Definition compression.h:428
gavl_packet_s::dts
int64_t dts
Decoding time.
Definition compression.h:436
gavl_packet_s::pes_pts
int64_t pes_pts
PTS from the PES stream (probably in another scale).
Definition compression.h:437
gavl_packet_s::timecode
gavl_timecode_t timecode
Timecode.
Definition compression.h:446
gavl_packet_s::sequence_end_pos
uint32_t sequence_end_pos
Position of sequence end code if any.
Definition compression.h:443
gavl_packet_s::src_rect
gavl_rectangle_i_t src_rect
Rectangle to take from a video frame.
Definition compression.h:448
gavl_packet_s::position
int64_t position
Position of the packet in the file. The exact meaning is format dependent.
Definition compression.h:433
gavl_packet_s::pts
int64_t pts
Presentation time.
Definition compression.h:435
gavl_packet_s::id
int32_t id
ID of the gavf stream where this packet belongs.
Definition compression.h:452
gavl_packet_s::dst_y
int32_t dst_y
Y-coordinate in the destination frame (for overlays).
Definition compression.h:450
gavl_packet_s::buf
gavl_buffer_t buf
Data.
Definition compression.h:429
gavl_packet_s::dst_x
int32_t dst_x
X-coordinate in the destination frame (for overlays).
Definition compression.h:449
gavl_packet_s::interlace_mode
gavl_interlace_mode_t interlace_mode
Interlace mode for mixed interlacing.
Definition compression.h:445
gavl_packet_s::flags
uint32_t flags
ORed combination of GAVL_PACKET_* flags.
Definition compression.h:431
gavl_packet_s::header_size
uint32_t header_size
Size of a repeated global header (or 0).
Definition compression.h:442
gavl_packet_s::field2_offset
uint32_t field2_offset
Offset of field 2 for field pictures.
Definition compression.h:441
gavl_packet_s::duration
int64_t duration
Duration of the contained frame.
Definition compression.h:439
gavl_palette_entry_t
Definition compression.h:375
gavl_palette_t
Definition compression.h:384
gavl_rectangle_i_t
Integer rectangle.
Definition gavl.h:1446
gavl_stream_stats_t
Definition compression.h:564