xine-lib 1.2.13-20230125hg15249
Data Structures | Macros | Typedefs | Enumerations | Functions | Variables
demux_qt.c File Reference
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <zlib.h>
#include "group_video.h"
#include <xine/xine_internal.h>
#include <xine/xineutils.h>
#include <xine/demux.h>
#include <xine/buffer.h>
#include <xine/mfrag.h>
#include "bswap.h"
#include "qtpalette.h"

Data Structures

struct  scale_int_t
 
struct  qt_frame
 
struct  edit_list_table_t
 
struct  sample_to_chunk_table_t
 
struct  reference_t
 
struct  properties_t
 
struct  qt_trak
 
struct  qt_info
 
struct  demux_qt_t
 

Macros

#define LOG_MODULE   "demux_qt"
 
#define QT_ATOM   BE_FOURCC
 
#define FREE_ATOM   QT_ATOM('f', 'r', 'e', 'e')
 
#define JUNK_ATOM   QT_ATOM('j', 'u', 'n', 'k')
 
#define MDAT_ATOM   QT_ATOM('m', 'd', 'a', 't')
 
#define MOOV_ATOM   QT_ATOM('m', 'o', 'o', 'v')
 
#define PNOT_ATOM   QT_ATOM('p', 'n', 'o', 't')
 
#define SKIP_ATOM   QT_ATOM('s', 'k', 'i', 'p')
 
#define WIDE_ATOM   QT_ATOM('w', 'i', 'd', 'e')
 
#define PICT_ATOM   QT_ATOM('P', 'I', 'C', 'T')
 
#define FTYP_ATOM   QT_ATOM('f', 't', 'y', 'p')
 
#define SIDX_ATOM   QT_ATOM('s', 'i', 'd', 'x')
 
#define CMOV_ATOM   QT_ATOM('c', 'm', 'o', 'v')
 
#define MVHD_ATOM   QT_ATOM('m', 'v', 'h', 'd')
 
#define VMHD_ATOM   QT_ATOM('v', 'm', 'h', 'd')
 
#define SMHD_ATOM   QT_ATOM('s', 'm', 'h', 'd')
 
#define TRAK_ATOM   QT_ATOM('t', 'r', 'a', 'k')
 
#define TKHD_ATOM   QT_ATOM('t', 'k', 'h', 'd')
 
#define MDHD_ATOM   QT_ATOM('m', 'd', 'h', 'd')
 
#define ELST_ATOM   QT_ATOM('e', 'l', 's', 't')
 
#define STSD_ATOM   QT_ATOM('s', 't', 's', 'd')
 
#define STSZ_ATOM   QT_ATOM('s', 't', 's', 'z')
 
#define STZ2_ATOM   QT_ATOM('s', 't', 'z', '2')
 
#define STSC_ATOM   QT_ATOM('s', 't', 's', 'c')
 
#define STCO_ATOM   QT_ATOM('s', 't', 'c', 'o')
 
#define STTS_ATOM   QT_ATOM('s', 't', 't', 's')
 
#define CTTS_ATOM   QT_ATOM('c', 't', 't', 's')
 
#define STSS_ATOM   QT_ATOM('s', 't', 's', 's')
 
#define CO64_ATOM   QT_ATOM('c', 'o', '6', '4')
 
#define ESDS_ATOM   QT_ATOM('e', 's', 'd', 's')
 
#define WAVE_ATOM   QT_ATOM('w', 'a', 'v', 'e')
 
#define FRMA_ATOM   QT_ATOM('f', 'r', 'm', 'a')
 
#define AVCC_ATOM   QT_ATOM('a', 'v', 'c', 'C')
 
#define HVCC_ATOM   QT_ATOM('h', 'v', 'c', 'C')
 
#define ENDA_ATOM   QT_ATOM('e', 'n', 'd', 'a')
 
#define IMA4_FOURCC   ME_FOURCC('i', 'm', 'a', '4')
 
#define MAC3_FOURCC   ME_FOURCC('M', 'A', 'C', '3')
 
#define MAC6_FOURCC   ME_FOURCC('M', 'A', 'C', '6')
 
#define ULAW_FOURCC   ME_FOURCC('u', 'l', 'a', 'w')
 
#define ALAW_FOURCC   ME_FOURCC('a', 'l', 'a', 'w')
 
#define MP4A_FOURCC   ME_FOURCC('m', 'p', '4', 'a')
 
#define SAMR_FOURCC   ME_FOURCC('s', 'a', 'm', 'r')
 
#define ALAC_FOURCC   ME_FOURCC('a', 'l', 'a', 'c')
 
#define DRMS_FOURCC   ME_FOURCC('d', 'r', 'm', 's')
 
#define TWOS_FOURCC   ME_FOURCC('t', 'w', 'o', 's')
 
#define SOWT_FOURCC   ME_FOURCC('s', 'o', 'w', 't')
 
#define RAW_FOURCC   ME_FOURCC('r', 'a', 'w', ' ')
 
#define IN24_FOURCC   ME_FOURCC('i', 'n', '2', '4')
 
#define NI42_FOURCC   ME_FOURCC('4', '2', 'n', 'i')
 
#define AVC1_FOURCC   ME_FOURCC('a', 'v', 'c', '1')
 
#define HVC1_FOURCC   ME_FOURCC('h', 'v', 'c', '1')
 
#define HEV1_FOURCC   ME_FOURCC('h', 'e', 'v', '1')
 
#define HEVC_FOURCC   ME_FOURCC('h', 'e', 'v', 'c')
 
#define AC_3_FOURCC   ME_FOURCC('a', 'c', '-', '3')
 
#define EAC3_FOURCC   ME_FOURCC('e', 'c', '-', '3')
 
#define QCLP_FOURCC   ME_FOURCC('Q', 'c', 'l', 'p')
 
#define UDTA_ATOM   QT_ATOM('u', 'd', 't', 'a')
 
#define META_ATOM   QT_ATOM('m', 'e', 't', 'a')
 
#define HDLR_ATOM   QT_ATOM('h', 'd', 'l', 'r')
 
#define ILST_ATOM   QT_ATOM('i', 'l', 's', 't')
 
#define NAM_ATOM   QT_ATOM(0xA9, 'n', 'a', 'm')
 
#define CPY_ATOM   QT_ATOM(0xA9, 'c', 'p', 'y')
 
#define DES_ATOM   QT_ATOM(0xA9, 'd', 'e', 's')
 
#define CMT_ATOM   QT_ATOM(0xA9, 'c', 'm', 't')
 
#define ALB_ATOM   QT_ATOM(0xA9, 'a', 'l', 'b')
 
#define GEN_ATOM   QT_ATOM(0xA9, 'g', 'e', 'n')
 
#define ART_ATOM   QT_ATOM(0xA9, 'A', 'R', 'T')
 
#define TOO_ATOM   QT_ATOM(0xA9, 't', 'o', 'o')
 
#define WRT_ATOM   QT_ATOM(0xA9, 'w', 'r', 't')
 
#define DAY_ATOM   QT_ATOM(0xA9, 'd', 'a', 'y')
 
#define RMRA_ATOM   QT_ATOM('r', 'm', 'r', 'a')
 
#define RMDA_ATOM   QT_ATOM('r', 'm', 'd', 'a')
 
#define RDRF_ATOM   QT_ATOM('r', 'd', 'r', 'f')
 
#define RMDR_ATOM   QT_ATOM('r', 'm', 'd', 'r')
 
#define RMVC_ATOM   QT_ATOM('r', 'm', 'v', 'c')
 
#define QTIM_ATOM   QT_ATOM('q', 't', 'i', 'm')
 
#define URL__ATOM   QT_ATOM('u', 'r', 'l', ' ')
 
#define DATA_ATOM   QT_ATOM('d', 'a', 't', 'a')
 
#define MVEX_ATOM   QT_ATOM('m', 'v', 'e', 'x')
 
#define MEHD_ATOM   QT_ATOM('m', 'e', 'h', 'd')
 
#define TREX_ATOM   QT_ATOM('t', 'r', 'e', 'x')
 
#define MOOF_ATOM   QT_ATOM('m', 'o', 'o', 'f')
 
#define MFHD_ATOM   QT_ATOM('m', 'v', 'h', 'd')
 
#define TRAF_ATOM   QT_ATOM('t', 'r', 'a', 'f')
 
#define TFHD_ATOM   QT_ATOM('t', 'f', 'h', 'd')
 
#define TRUN_ATOM   QT_ATOM('t', 'r', 'u', 'n')
 
#define MAX_MOOV_SIZE   (128 << 20)
 
#define ATOM_PREAMBLE_SIZE   8
 
#define PALETTE_COUNT   256
 
#define MAX_PTS_DIFF   100000
 
#define QTF_OFFSET(f)   ((f)._ffs.offset & ~((uint64_t)0xffff << 48))
 
#define QTF_KEYFRAME(f)   ((f)._ffs.bytes[7])
 
#define QTF_MEDIA_ID(f)   ((f)._ffs.bytes[6])
 
#define MAX_AUDIO_TRAKS   8
 
#define DEBUG_ATOM_LOAD   0
 
#define DEBUG_EDIT_LIST   0
 
#define DEBUG_FRAME_TABLE   0
 
#define DEBUG_VIDEO_DEMUX   0
 
#define DEBUG_AUDIO_DEMUX   0
 
#define DEBUG_META_LOAD   0
 
#define DEBUG_DUMP_MOOV   0
 
#define RAW_MOOV_FILENAME   "moovatom.raw"
 
#define WRITE_BE_32(v, p)
 
#define KEYFRAMES_SIZE   1024
 

Typedefs

typedef unsigned int qt_atom
 

Enumerations

enum  qt_error {
  QT_OK , QT_FILE_READ_ERROR , QT_NO_MEMORY , QT_NOT_A_VALID_FILE ,
  QT_NO_MOOV_ATOM , QT_NO_ZLIB , QT_ZLIB_ERROR , QT_HEADER_TROUBLE ,
  QT_DRM_NOT_SUPPORTED
}
 
enum  media_type { MEDIA_AUDIO , MEDIA_VIDEO , MEDIA_OTHER }
 

Functions

static void scale_int_init (scale_int_t *scale, uint32_t num, uint32_t den)
 
static void scale_int_do (scale_int_t *scale, int64_t *v)
 
static void XINE_FORMAT_PRINTF (1, 2)
 
static void dump_moov_atom (uint8_t *moov_atom, int moov_atom_size)
 
static void reset_qt_info (demux_qt_t *this)
 
static qt_infocreate_qt_info (demux_qt_t *this)
 
static void free_qt_info (demux_qt_t *this)
 
static void parse_mvhd_atom (demux_qt_t *this, uint8_t *mvhd_atom)
 
static int mp4_read_descr_len (uint8_t *s, uint32_t *length)
 
static void find_embedded_atoms (uint8_t *atom, const uint32_t *types, uint8_t **found, uint32_t *sizes)
 
static int atom_scan (uint8_t *atom, int depth, const uint32_t *types, uint8_t **found, unsigned int *sizes)
 
static qt_error parse_trak_atom (qt_trak *trak, uint8_t *trak_atom)
 
static qt_error parse_reference_atom (demux_qt_t *this, uint8_t *ref_atom, char *base_mrl)
 
static void qt_normpos_init (demux_qt_t *this)
 
static int32_t qt_msec_2_normpos (demux_qt_t *this, int32_t msec)
 
static int32_t qt_pts_2_msecs (int64_t pts)
 
static void qt_keyframes_size (qt_trak *trak, uint32_t n)
 
static void qt_keyframes_simple_add (qt_trak *trak, qt_frame *f)
 
static qt_error build_frame_table (qt_trak *trak, unsigned int global_timescale)
 
static int demux_qt_load_fragment_index (demux_qt_t *this, const uint8_t *head, uint32_t hsize)
 
static qt_trakfind_trak_by_id (demux_qt_t *this, int id)
 
static int parse_mvex_atom (demux_qt_t *this, uint8_t *mvex_atom, unsigned int bufsize)
 
static int parse_traf_atom (demux_qt_t *this, uint8_t *traf_atom, unsigned int trafsize, off_t moofpos)
 
static int parse_moof_atom (demux_qt_t *this, uint8_t *moof_atom, int moofsize, off_t moofpos)
 
static int fragment_scan (demux_qt_t *this)
 
static void info_string_from_atom (uint8_t *atom, char **target)
 
static void qt_update_duration (demux_qt_t *this)
 
static void parse_moov_atom (demux_qt_t *this, uint8_t *moov_atom)
 
static qt_error load_moov_atom (input_plugin_t *input, uint8_t **moov_atom, off_t *moov_atom_offset)
 
static qt_error open_qt_file (demux_qt_t *this, uint8_t *moov_atom, off_t moov_atom_offset)
 
static int demux_qt_send_chunk (demux_plugin_t *this_gen)
 
static void demux_qt_send_headers (demux_plugin_t *this_gen)
 
static int binary_seek (demux_qt_t *this, qt_trak *trak, off_t start_pos, int start_time)
 
static int demux_qt_seek (demux_plugin_t *this_gen, off_t start_pos, int start_time, int playing)
 
static void demux_qt_dispose (demux_plugin_t *this_gen)
 
static int demux_qt_get_status (demux_plugin_t *this_gen)
 
static int demux_qt_get_stream_length (demux_plugin_t *this_gen)
 
static uint32_t demux_qt_get_capabilities (demux_plugin_t *this_gen)
 
static int demux_qt_get_optional_data (demux_plugin_t *this_gen, void *data, int data_type)
 
static demux_plugin_topen_plugin (demux_class_t *class_gen, xine_stream_t *stream, input_plugin_t *input)
 
void * demux_qt_init_class (xine_t *xine, const void *data)
 

Variables

static const uint32_t bandwidths []
 Network bandwidth, cribbed from src/input/input_mms.c.
 

Macro Definition Documentation

◆ AC_3_FOURCC

#define AC_3_FOURCC   ME_FOURCC('a', 'c', '-', '3')

Referenced by parse_trak_atom().

◆ ALAC_FOURCC

#define ALAC_FOURCC   ME_FOURCC('a', 'l', 'a', 'c')

Referenced by parse_trak_atom().

◆ ALAW_FOURCC

#define ALAW_FOURCC   ME_FOURCC('a', 'l', 'a', 'w')

Referenced by parse_trak_atom().

◆ ALB_ATOM

#define ALB_ATOM   QT_ATOM(0xA9, 'a', 'l', 'b')

Referenced by parse_moov_atom().

◆ ART_ATOM

#define ART_ATOM   QT_ATOM(0xA9, 'A', 'R', 'T')

Referenced by parse_moov_atom().

◆ ATOM_PREAMBLE_SIZE

#define ATOM_PREAMBLE_SIZE   8

◆ AVC1_FOURCC

#define AVC1_FOURCC   ME_FOURCC('a', 'v', 'c', '1')

Referenced by demux_qt_send_headers().

◆ AVCC_ATOM

#define AVCC_ATOM   QT_ATOM('a', 'v', 'c', 'C')

Referenced by parse_trak_atom().

◆ CMOV_ATOM

#define CMOV_ATOM   QT_ATOM('c', 'm', 'o', 'v')

Referenced by load_moov_atom(), and open_qt_file().

◆ CMT_ATOM

#define CMT_ATOM   QT_ATOM(0xA9, 'c', 'm', 't')

Referenced by parse_moov_atom().

◆ CO64_ATOM

#define CO64_ATOM   QT_ATOM('c', 'o', '6', '4')

Referenced by parse_trak_atom().

◆ CPY_ATOM

#define CPY_ATOM   QT_ATOM(0xA9, 'c', 'p', 'y')

Referenced by parse_moov_atom().

◆ CTTS_ATOM

#define CTTS_ATOM   QT_ATOM('c', 't', 't', 's')

Referenced by parse_trak_atom().

◆ DATA_ATOM

#define DATA_ATOM   QT_ATOM('d', 'a', 't', 'a')

Referenced by info_string_from_atom().

◆ DAY_ATOM

#define DAY_ATOM   QT_ATOM(0xA9, 'd', 'a', 'y')

Referenced by parse_moov_atom().

◆ DEBUG_ATOM_LOAD

#define DEBUG_ATOM_LOAD   0

◆ DEBUG_AUDIO_DEMUX

#define DEBUG_AUDIO_DEMUX   0

◆ DEBUG_DUMP_MOOV

#define DEBUG_DUMP_MOOV   0

◆ DEBUG_EDIT_LIST

#define DEBUG_EDIT_LIST   0

◆ DEBUG_FRAME_TABLE

#define DEBUG_FRAME_TABLE   0

◆ DEBUG_META_LOAD

#define DEBUG_META_LOAD   0

◆ DEBUG_VIDEO_DEMUX

#define DEBUG_VIDEO_DEMUX   0

◆ DES_ATOM

#define DES_ATOM   QT_ATOM(0xA9, 'd', 'e', 's')

Referenced by parse_moov_atom().

◆ DRMS_FOURCC

#define DRMS_FOURCC   ME_FOURCC('d', 'r', 'm', 's')

Referenced by parse_trak_atom().

◆ EAC3_FOURCC

#define EAC3_FOURCC   ME_FOURCC('e', 'c', '-', '3')

Referenced by parse_trak_atom().

◆ ELST_ATOM

#define ELST_ATOM   QT_ATOM('e', 'l', 's', 't')

Referenced by parse_trak_atom().

◆ ENDA_ATOM

#define ENDA_ATOM   QT_ATOM('e', 'n', 'd', 'a')

Referenced by parse_trak_atom().

◆ ESDS_ATOM

#define ESDS_ATOM   QT_ATOM('e', 's', 'd', 's')

Referenced by parse_trak_atom().

◆ FREE_ATOM

#define FREE_ATOM   QT_ATOM('f', 'r', 'e', 'e')

Referenced by load_moov_atom(), and parse_moov_atom().

◆ FRMA_ATOM

#define FRMA_ATOM   QT_ATOM('f', 'r', 'm', 'a')

Referenced by parse_trak_atom().

◆ FTYP_ATOM

#define FTYP_ATOM   QT_ATOM('f', 't', 'y', 'p')

Referenced by load_moov_atom().

◆ GEN_ATOM

#define GEN_ATOM   QT_ATOM(0xA9, 'g', 'e', 'n')

Referenced by parse_moov_atom().

◆ HDLR_ATOM

#define HDLR_ATOM   QT_ATOM('h', 'd', 'l', 'r')

◆ HEV1_FOURCC

#define HEV1_FOURCC   ME_FOURCC('h', 'e', 'v', '1')

Referenced by demux_qt_send_headers().

◆ HEVC_FOURCC

#define HEVC_FOURCC   ME_FOURCC('h', 'e', 'v', 'c')

Referenced by demux_qt_send_headers().

◆ HVC1_FOURCC

#define HVC1_FOURCC   ME_FOURCC('h', 'v', 'c', '1')

Referenced by demux_qt_send_headers().

◆ HVCC_ATOM

#define HVCC_ATOM   QT_ATOM('h', 'v', 'c', 'C')

Referenced by parse_trak_atom().

◆ ILST_ATOM

#define ILST_ATOM   QT_ATOM('i', 'l', 's', 't')

◆ IMA4_FOURCC

#define IMA4_FOURCC   ME_FOURCC('i', 'm', 'a', '4')

Referenced by parse_trak_atom().

◆ IN24_FOURCC

#define IN24_FOURCC   ME_FOURCC('i', 'n', '2', '4')

Referenced by parse_trak_atom().

◆ JUNK_ATOM

#define JUNK_ATOM   QT_ATOM('j', 'u', 'n', 'k')

Referenced by load_moov_atom().

◆ KEYFRAMES_SIZE

#define KEYFRAMES_SIZE   1024

Referenced by qt_keyframes_size().

◆ LOG_MODULE

#define LOG_MODULE   "demux_qt"

Referenced by demux_qt_send_headers().

◆ MAC3_FOURCC

#define MAC3_FOURCC   ME_FOURCC('M', 'A', 'C', '3')

Referenced by parse_trak_atom().

◆ MAC6_FOURCC

#define MAC6_FOURCC   ME_FOURCC('M', 'A', 'C', '6')

Referenced by parse_trak_atom().

◆ MAX_AUDIO_TRAKS

#define MAX_AUDIO_TRAKS   8

◆ MAX_MOOV_SIZE

#define MAX_MOOV_SIZE   (128 << 20)

Referenced by load_moov_atom(), and open_qt_file().

◆ MAX_PTS_DIFF

#define MAX_PTS_DIFF   100000

Referenced by demux_qt_send_chunk().

◆ MDAT_ATOM

#define MDAT_ATOM   QT_ATOM('m', 'd', 'a', 't')

Referenced by fragment_scan(), and load_moov_atom().

◆ MDHD_ATOM

#define MDHD_ATOM   QT_ATOM('m', 'd', 'h', 'd')

Referenced by parse_trak_atom().

◆ MEHD_ATOM

#define MEHD_ATOM   QT_ATOM('m', 'e', 'h', 'd')

Referenced by parse_mvex_atom().

◆ META_ATOM

#define META_ATOM   QT_ATOM('m', 'e', 't', 'a')

Referenced by atom_scan().

◆ MFHD_ATOM

#define MFHD_ATOM   QT_ATOM('m', 'v', 'h', 'd')

Referenced by parse_moof_atom().

◆ MOOF_ATOM

#define MOOF_ATOM   QT_ATOM('m', 'o', 'o', 'f')

Referenced by fragment_scan().

◆ MOOV_ATOM

#define MOOV_ATOM   QT_ATOM('m', 'o', 'o', 'v')

Referenced by load_moov_atom(), and parse_moov_atom().

◆ MP4A_FOURCC

#define MP4A_FOURCC   ME_FOURCC('m', 'p', '4', 'a')

Referenced by parse_trak_atom().

◆ MVEX_ATOM

#define MVEX_ATOM   QT_ATOM('m', 'v', 'e', 'x')

Referenced by parse_moov_atom().

◆ MVHD_ATOM

#define MVHD_ATOM   QT_ATOM('m', 'v', 'h', 'd')

Referenced by load_moov_atom(), and parse_moov_atom().

◆ NAM_ATOM

#define NAM_ATOM   QT_ATOM(0xA9, 'n', 'a', 'm')

Referenced by parse_moov_atom().

◆ NI42_FOURCC

#define NI42_FOURCC   ME_FOURCC('4', '2', 'n', 'i')

Referenced by parse_trak_atom().

◆ PALETTE_COUNT

#define PALETTE_COUNT   256

Referenced by parse_trak_atom().

◆ PICT_ATOM

#define PICT_ATOM   QT_ATOM('P', 'I', 'C', 'T')

Referenced by load_moov_atom().

◆ PNOT_ATOM

#define PNOT_ATOM   QT_ATOM('p', 'n', 'o', 't')

Referenced by load_moov_atom().

◆ QCLP_FOURCC

#define QCLP_FOURCC   ME_FOURCC('Q', 'c', 'l', 'p')

Referenced by parse_trak_atom().

◆ QT_ATOM

#define QT_ATOM   BE_FOURCC

◆ QTF_KEYFRAME

#define QTF_KEYFRAME ( f)    ((f)._ffs.bytes[7])

◆ QTF_MEDIA_ID

#define QTF_MEDIA_ID ( f)    ((f)._ffs.bytes[6])

◆ QTF_OFFSET

#define QTF_OFFSET ( f)    ((f)._ffs.offset & ~((uint64_t)0xffff << 48))

◆ QTIM_ATOM

#define QTIM_ATOM   QT_ATOM('q', 't', 'i', 'm')

Referenced by parse_reference_atom().

◆ RAW_FOURCC

#define RAW_FOURCC   ME_FOURCC('r', 'a', 'w', ' ')

Referenced by parse_trak_atom().

◆ RAW_MOOV_FILENAME

#define RAW_MOOV_FILENAME   "moovatom.raw"

Referenced by dump_moov_atom().

◆ RDRF_ATOM

#define RDRF_ATOM   QT_ATOM('r', 'd', 'r', 'f')

◆ RMDA_ATOM

#define RMDA_ATOM   QT_ATOM('r', 'm', 'd', 'a')

Referenced by parse_moov_atom().

◆ RMDR_ATOM

#define RMDR_ATOM   QT_ATOM('r', 'm', 'd', 'r')

Referenced by parse_reference_atom().

◆ RMRA_ATOM

#define RMRA_ATOM   QT_ATOM('r', 'm', 'r', 'a')

◆ RMVC_ATOM

#define RMVC_ATOM   QT_ATOM('r', 'm', 'v', 'c')

◆ SAMR_FOURCC

#define SAMR_FOURCC   ME_FOURCC('s', 'a', 'm', 'r')

Referenced by parse_trak_atom().

◆ SIDX_ATOM

#define SIDX_ATOM   QT_ATOM('s', 'i', 'd', 'x')

Referenced by fragment_scan().

◆ SKIP_ATOM

#define SKIP_ATOM   QT_ATOM('s', 'k', 'i', 'p')

Referenced by load_moov_atom().

◆ SMHD_ATOM

#define SMHD_ATOM   QT_ATOM('s', 'm', 'h', 'd')

Referenced by parse_trak_atom().

◆ SOWT_FOURCC

#define SOWT_FOURCC   ME_FOURCC('s', 'o', 'w', 't')

◆ STCO_ATOM

#define STCO_ATOM   QT_ATOM('s', 't', 'c', 'o')

Referenced by parse_trak_atom().

◆ STSC_ATOM

#define STSC_ATOM   QT_ATOM('s', 't', 's', 'c')

Referenced by parse_trak_atom().

◆ STSD_ATOM

#define STSD_ATOM   QT_ATOM('s', 't', 's', 'd')

Referenced by parse_trak_atom().

◆ STSS_ATOM

#define STSS_ATOM   QT_ATOM('s', 't', 's', 's')

Referenced by parse_trak_atom().

◆ STSZ_ATOM

#define STSZ_ATOM   QT_ATOM('s', 't', 's', 'z')

Referenced by parse_trak_atom().

◆ STTS_ATOM

#define STTS_ATOM   QT_ATOM('s', 't', 't', 's')

Referenced by parse_trak_atom().

◆ STZ2_ATOM

#define STZ2_ATOM   QT_ATOM('s', 't', 'z', '2')

Referenced by parse_trak_atom().

◆ TFHD_ATOM

#define TFHD_ATOM   QT_ATOM('t', 'f', 'h', 'd')

Referenced by parse_traf_atom().

◆ TKHD_ATOM

#define TKHD_ATOM   QT_ATOM('t', 'k', 'h', 'd')

Referenced by parse_trak_atom().

◆ TOO_ATOM

#define TOO_ATOM   QT_ATOM(0xA9, 't', 'o', 'o')

◆ TRAF_ATOM

#define TRAF_ATOM   QT_ATOM('t', 'r', 'a', 'f')

Referenced by parse_moof_atom().

◆ TRAK_ATOM

#define TRAK_ATOM   QT_ATOM('t', 'r', 'a', 'k')

Referenced by parse_moov_atom().

◆ TREX_ATOM

#define TREX_ATOM   QT_ATOM('t', 'r', 'e', 'x')

Referenced by parse_mvex_atom().

◆ TRUN_ATOM

#define TRUN_ATOM   QT_ATOM('t', 'r', 'u', 'n')

Referenced by parse_traf_atom().

◆ TWOS_FOURCC

#define TWOS_FOURCC   ME_FOURCC('t', 'w', 'o', 's')

◆ UDTA_ATOM

#define UDTA_ATOM   QT_ATOM('u', 'd', 't', 'a')

◆ ULAW_FOURCC

#define ULAW_FOURCC   ME_FOURCC('u', 'l', 'a', 'w')

Referenced by parse_trak_atom().

◆ URL__ATOM

#define URL__ATOM   QT_ATOM('u', 'r', 'l', ' ')

Referenced by parse_reference_atom().

◆ VMHD_ATOM

#define VMHD_ATOM   QT_ATOM('v', 'm', 'h', 'd')

Referenced by parse_trak_atom().

◆ WAVE_ATOM

#define WAVE_ATOM   QT_ATOM('w', 'a', 'v', 'e')

Referenced by parse_trak_atom().

◆ WIDE_ATOM

#define WIDE_ATOM   QT_ATOM('w', 'i', 'd', 'e')

Referenced by load_moov_atom().

◆ WRITE_BE_32

#define WRITE_BE_32 ( v,
p )
Value:
{ \
uint8_t *wp = (uint8_t *)(p); \
uint32_t wv = (v); \
wp[0] = wv >> 24; \
wp[1] = wv >> 16; \
wp[2] = wv >> 8; \
wp[3] = wv; \
}
uint32_t v
Definition utils.c:1157

Referenced by atom_scan(), and open_qt_file().

◆ WRT_ATOM

#define WRT_ATOM   QT_ATOM(0xA9, 'w', 'r', 't')

Referenced by parse_moov_atom().

Typedef Documentation

◆ qt_atom

typedef unsigned int qt_atom

Enumeration Type Documentation

◆ media_type

enum media_type
Enumerator
MEDIA_AUDIO 
MEDIA_VIDEO 
MEDIA_OTHER 

◆ qt_error

enum qt_error
Enumerator
QT_OK 
QT_FILE_READ_ERROR 
QT_NO_MEMORY 
QT_NOT_A_VALID_FILE 
QT_NO_MOOV_ATOM 
QT_NO_ZLIB 
QT_ZLIB_ERROR 
QT_HEADER_TROUBLE 
QT_DRM_NOT_SUPPORTED 

Function Documentation

◆ atom_scan()

static int atom_scan ( uint8_t * atom,
int depth,
const uint32_t * types,
uint8_t ** found,
unsigned int * sizes )
static

<< list of atom sizes to fill in.

Parameters
atom<< return value: # of missing atoms.
depth<< the atom to parse.
types<< how many levels of hierarchy to examine.
found<< zero terminated list of interesting atom types.
sizes<< list of atom pointers to fill in.

References _X_BE_32, atom_scan(), META_ATOM, NULL, WRITE_BE_32, and xine_hexdump().

Referenced by atom_scan(), parse_moov_atom(), parse_reference_atom(), and parse_trak_atom().

◆ binary_seek()

static int binary_seek ( demux_qt_t * this,
qt_trak * trak,
off_t start_pos,
int start_time )
static

◆ build_frame_table()

static qt_error build_frame_table ( qt_trak * trak,
unsigned int global_timescale )
static

◆ create_qt_info()

static qt_info * create_qt_info ( demux_qt_t * this)
static

References reset_qt_info().

Referenced by open_plugin().

◆ demux_qt_dispose()

static void demux_qt_dispose ( demux_plugin_t * this_gen)
static

References free_qt_info().

Referenced by open_plugin().

◆ demux_qt_get_capabilities()

static uint32_t demux_qt_get_capabilities ( demux_plugin_t * this_gen)
static

References DEMUX_CAP_AUDIOLANG, and DEMUX_CAP_VIDEO_TIME.

Referenced by open_plugin().

◆ demux_qt_get_optional_data()

static int demux_qt_get_optional_data ( demux_plugin_t * this_gen,
void * data,
int data_type )
static

◆ demux_qt_get_status()

static int demux_qt_get_status ( demux_plugin_t * this_gen)
static

Referenced by open_plugin().

◆ demux_qt_get_stream_length()

static int demux_qt_get_stream_length ( demux_plugin_t * this_gen)
static

Referenced by open_plugin().

◆ demux_qt_init_class()

void * demux_qt_init_class ( xine_t * xine,
const void * data )

◆ demux_qt_load_fragment_index()

static int demux_qt_load_fragment_index ( demux_qt_t * this,
const uint8_t * head,
uint32_t hsize )
static

◆ demux_qt_seek()

static int demux_qt_seek ( demux_plugin_t * this_gen,
off_t start_pos,
int start_time,
int playing )
static

◆ demux_qt_send_chunk()

static int demux_qt_send_chunk ( demux_plugin_t * this_gen)
static

◆ demux_qt_send_headers()

static void demux_qt_send_headers ( demux_plugin_t * this_gen)
static

References _x_demux_control_start(), _x_fourcc_to_buf_video(), _x_meta_info_set(), _x_report_audio_format_tag(), _x_report_video_fourcc(), _x_stream_info_set(), properties_t::audio, qt_trak::audio_index, AVC1_FOURCC, properties_t::bits, BUF_AUDIO_UNKNOWN, BUF_FLAG_FRAME_END, BUF_FLAG_HEADER, BUF_FLAG_SPECIAL, BUF_FLAG_STDHEADER, BUF_SPECIAL_DECODER_CONFIG, BUF_SPECIAL_PALETTE, BUF_SPECIAL_STSD_ATOM, BUF_VIDEO_MPEG4, BUF_VIDEO_MSMPEG4_V1, BUF_VIDEO_UNKNOWN, properties_t::bytes_per_frame, properties_t::channels, properties_t::codec_buftype, properties_t::codec_fourcc, buf_element_s::content, properties_t::decoder_config, properties_t::decoder_config_len, buf_element_s::decoder_flags, buf_element_s::decoder_info, buf_element_s::decoder_info_ptr, DEMUX_OK, properties_t::depth, qt_trak::frame_count, qt_trak::frames, properties_t::height, HEV1_FOURCC, HEVC_FOURCC, HVC1_FOURCC, LOG_MODULE, MAX_AUDIO_TRAKS, buf_element_s::max_size, MEDIA_AUDIO, NULL, properties_t::palette, properties_t::palette_count, qt_trak::properties, properties_t::properties_atom, properties_t::properties_atom_size, QTF_OFFSET, properties_t::s, properties_t::sample_rate, properties_t::samples_per_frame, buf_element_s::size, qt_frame::size, buf_element_s::type, qt_trak::type, properties_t::vbr, properties_t::video, properties_t::wave, properties_t::wave_size, properties_t::width, XINE_META_INFO_ALBUM, XINE_META_INFO_ARTIST, XINE_META_INFO_COMMENT, XINE_META_INFO_GENRE, XINE_META_INFO_TITLE, XINE_META_INFO_YEAR, XINE_STREAM_INFO_AUDIO_BITRATE, XINE_STREAM_INFO_AUDIO_BITS, XINE_STREAM_INFO_AUDIO_CHANNELS, XINE_STREAM_INFO_AUDIO_FOURCC, XINE_STREAM_INFO_AUDIO_SAMPLERATE, XINE_STREAM_INFO_HAS_AUDIO, XINE_STREAM_INFO_HAS_VIDEO, XINE_STREAM_INFO_VIDEO_FOURCC, XINE_STREAM_INFO_VIDEO_HEIGHT, and XINE_STREAM_INFO_VIDEO_WIDTH.

Referenced by open_plugin().

◆ dump_moov_atom()

static void dump_moov_atom ( uint8_t * moov_atom,
int moov_atom_size )
inlinestatic

References RAW_MOOV_FILENAME.

Referenced by open_qt_file().

◆ find_embedded_atoms()

static void find_embedded_atoms ( uint8_t * atom,
const uint32_t * types,
uint8_t ** found,
uint32_t * sizes )
static

References _X_BE_32, NULL, and v.

Referenced by parse_trak_atom().

◆ find_trak_by_id()

static qt_trak * find_trak_by_id ( demux_qt_t * this,
int id )
static

References NULL.

Referenced by parse_mvex_atom(), and parse_traf_atom().

◆ fragment_scan()

static int fragment_scan ( demux_qt_t * this)
static

◆ free_qt_info()

static void free_qt_info ( demux_qt_t * this)
static

References MEDIA_AUDIO, and reset_qt_info().

Referenced by demux_qt_dispose(), and open_plugin().

◆ info_string_from_atom()

static void info_string_from_atom ( uint8_t * atom,
char ** target )
static

References _X_BE_16, _X_BE_32, DATA_ATOM, NULL, and string_size.

Referenced by parse_moov_atom().

◆ load_moov_atom()

static qt_error load_moov_atom ( input_plugin_t * input,
uint8_t ** moov_atom,
off_t * moov_atom_offset )
static

◆ mp4_read_descr_len()

static int mp4_read_descr_len ( uint8_t * s,
uint32_t * length )
static

Referenced by parse_trak_atom().

◆ open_plugin()

static demux_plugin_t * open_plugin ( demux_class_t * class_gen,
xine_stream_t * stream,
input_plugin_t * input )
static

◆ open_qt_file()

static qt_error open_qt_file ( demux_qt_t * this,
uint8_t * moov_atom,
off_t moov_atom_offset )
static

◆ parse_moof_atom()

static int parse_moof_atom ( demux_qt_t * this,
uint8_t * moof_atom,
int moofsize,
off_t moofpos )
static

References _X_BE_32, MFHD_ATOM, parse_traf_atom(), and TRAF_ATOM.

Referenced by fragment_scan().

◆ parse_moov_atom()

static void parse_moov_atom ( demux_qt_t * this,
uint8_t * moov_atom )
static

◆ parse_mvex_atom()

static int parse_mvex_atom ( demux_qt_t * this,
uint8_t * mvex_atom,
unsigned int bufsize )
static

◆ parse_mvhd_atom()

static void parse_mvhd_atom ( demux_qt_t * this,
uint8_t * mvhd_atom )
static

References _X_BE_32.

Referenced by parse_moov_atom().

◆ parse_reference_atom()

static qt_error parse_reference_atom ( demux_qt_t * this,
uint8_t * ref_atom,
char * base_mrl )
static

◆ parse_traf_atom()

static int parse_traf_atom ( demux_qt_t * this,
uint8_t * traf_atom,
unsigned int trafsize,
off_t moofpos )
static

◆ parse_trak_atom()

static qt_error parse_trak_atom ( qt_trak * trak,
uint8_t * trak_atom )
static

<< note: using this as default.

References _X_BE_16, _X_BE_24, _X_BE_32, _X_BE_64, _x_formattag_to_buf_audio(), _X_ME_32, _x_tag32_me2str(), _x_waveformatex_le2me(), AC_3_FOURCC, ALAC_FOURCC, ALAW_FOURCC, atom_scan(), properties_t::audio, AVCC_ATOM, palette_entry_s::b, properties_t::bits, BUF_AUDIO_A52, BUF_AUDIO_AAC, BUF_AUDIO_DTS, BUF_AUDIO_EAC3, BUF_AUDIO_MPEG, BUF_AUDIO_QCLP, BUF_AUDIO_VORBIS, properties_t::bytes_per_frame, properties_t::bytes_per_packet, properties_t::bytes_per_sample, properties_t::channels, qt_trak::chunk_offset_count, qt_trak::chunk_offset_table32, qt_trak::chunk_offset_table64, CO64_ATOM, properties_t::codec_buftype, properties_t::codec_fourcc, properties_t::codec_str, CTTS_ATOM, qt_trak::current_frame, properties_t::decoder_config, properties_t::decoder_config_len, qt_trak::delay_index, properties_t::depth, DRMS_FOURCC, EAC3_FOURCC, qt_trak::edit_list_count, qt_trak::edit_list_table, ELST_ATOM, ENDA_ATOM, ESDS_ATOM, find_embedded_atoms(), sample_to_chunk_table_t::first_chunk, qt_trak::flags, qt_trak::frame_count, qt_trak::frames, FRMA_ATOM, palette_entry_s::g, properties_t::height, HVCC_ATOM, qt_trak::id, IMA4_FOURCC, IN24_FOURCC, qt_trak::keyframes_list, qt_trak::keyframes_size, qt_trak::keyframes_used, qt_trak::lang, MAC3_FOURCC, MAC6_FOURCC, MDHD_ATOM, MEDIA_AUDIO, sample_to_chunk_table_t::media_id, properties_t::media_id, MEDIA_OTHER, edit_list_table_t::media_time, MEDIA_VIDEO, mp4_read_descr_len(), MP4A_FOURCC, name, NI42_FOURCC, NULL, properties_t::object_type_id, properties_t::palette, PALETTE_COUNT, properties_t::palette_count, qt_trak::properties, properties_t::properties_atom, properties_t::properties_atom_size, QCLP_FOURCC, qt_default_palette_16, qt_default_palette_256, qt_default_palette_4, QT_DRM_NOT_SUPPORTED, QT_HEADER_TROUBLE, QT_NO_MEMORY, QT_OK, palette_entry_s::r, RAW_FOURCC, properties_t::s, properties_t::sample_rate, qt_trak::sample_size, qt_trak::sample_size_bytes, qt_trak::sample_size_count, qt_trak::sample_size_shift, qt_trak::sample_size_table, qt_trak::sample_to_chunk_count, qt_trak::sample_to_chunk_table, qt_trak::samples, sample_to_chunk_table_t::samples_per_chunk, properties_t::samples_per_frame, properties_t::samples_per_packet, SAMR_FOURCC, scale_int_init(), qt_trak::si, SMHD_ATOM, SOWT_FOURCC, STCO_ATOM, STSC_ATOM, STSD_ATOM, qt_trak::stsd_atoms, qt_trak::stsd_atoms_count, STSS_ATOM, STSZ_ATOM, STTS_ATOM, STZ2_ATOM, qt_trak::sync_sample_count, qt_trak::sync_sample_table, qt_trak::time_to_sample_count, qt_trak::time_to_sample_table, qt_trak::timeoffs_to_sample_count, qt_trak::timeoffs_to_sample_table, qt_trak::timescale, TKHD_ATOM, edit_list_table_t::track_duration, TWOS_FOURCC, qt_trak::type, ULAW_FOURCC, properties_t::vbr, properties_t::video, VMHD_ATOM, properties_t::wave, WAVE_ATOM, properties_t::wave_size, and properties_t::width.

Referenced by parse_moov_atom().

◆ qt_keyframes_simple_add()

static void qt_keyframes_simple_add ( qt_trak * trak,
qt_frame * f )
static

◆ qt_keyframes_size()

static void qt_keyframes_size ( qt_trak * trak,
uint32_t n )
static

◆ qt_msec_2_normpos()

static int32_t qt_msec_2_normpos ( demux_qt_t * this,
int32_t msec )
static

◆ qt_normpos_init()

static void qt_normpos_init ( demux_qt_t * this)
static

Referenced by qt_update_duration().

◆ qt_pts_2_msecs()

static int32_t qt_pts_2_msecs ( int64_t pts)
static

◆ qt_update_duration()

static void qt_update_duration ( demux_qt_t * this)
static

◆ reset_qt_info()

static void reset_qt_info ( demux_qt_t * this)
static

References NULL, and QT_OK.

Referenced by create_qt_info(), and free_qt_info().

◆ scale_int_do()

static void scale_int_do ( scale_int_t * scale,
int64_t * v )
static

◆ scale_int_init()

static void scale_int_init ( scale_int_t * scale,
uint32_t num,
uint32_t den )
static

References scale_int_t::den, and scale_int_t::num.

Referenced by parse_trak_atom().

◆ XINE_FORMAT_PRINTF()

static void XINE_FORMAT_PRINTF ( 1 ,
2  )
inlinestatic

Variable Documentation

◆ bandwidths

const uint32_t bandwidths[]
static
Initial value:
= {
14400, 19200, 28800, 33600, 34430, 57600,
115200, 262200, 393216, 524300, 1544000, 10485800
}

Network bandwidth, cribbed from src/input/input_mms.c.

Referenced by open_plugin().