X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmp4%2Flibmp4.h;h=992c1bb534f5b632327959baf9a04a72bdf1a039;hb=13a7c9af3c209bbd450925672162aff2f40a2494;hp=0549537c205eb03daec40c18f19e371ab90cc6d5;hpb=ec6c15021f777bdef9da38c1fb77869953f58ecd;p=vlc diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h index 0549537c20..992c1bb534 100644 --- a/modules/demux/mp4/libmp4.h +++ b/modules/demux/mp4/libmp4.h @@ -1,15 +1,15 @@ /***************************************************************************** * libmp4.h : LibMP4 library for mp4 module for vlc ***************************************************************************** - * Copyright (C) 2001 VideoLAN - * $Id: libmp4.h,v 1.10 2003/04/22 08:51:28 fenrir Exp $ + * Copyright (C) 2001-2004 the VideoLAN team + * $Id$ * Authors: Laurent Aimar - * + * * 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 @@ -17,17 +17,21 @@ * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. *****************************************************************************/ +#ifndef _VLC_MP4_H +#define _VLC_MP4_H 1 + #define FOURCC_uuid VLC_FOURCC( 'u', 'u', 'i', 'd' ) #define FOURCC_ftyp VLC_FOURCC( 'f', 't', 'y', 'p' ) #define FOURCC_moov VLC_FOURCC( 'm', 'o', 'o', 'v' ) +#define FOURCC_foov VLC_FOURCC( 'f', 'o', 'o', 'v' ) #define FOURCC_cmov VLC_FOURCC( 'c', 'm', 'o', 'v' ) #define FOURCC_dcom VLC_FOURCC( 'd', 'c', 'o', 'm' ) #define FOURCC_cmvd VLC_FOURCC( 'c', 'm', 'v', 'd' ) - + #define FOURCC_moof VLC_FOURCC( 'm', 'o', 'o', 'f' ) #define FOURCC_mdat VLC_FOURCC( 'm', 'd', 'a', 't' ) #define FOURCC_skip VLC_FOURCC( 's', 'k', 'i', 'p' ) @@ -76,12 +80,14 @@ #define FOURCC_iods VLC_FOURCC( 'i', 'o', 'd', 's' ) #define FOURCC_nmhd VLC_FOURCC( 'n', 'm', 'h', 'd' ) +#define FOURCC_mp2v VLC_FOURCC( 'm', 'p', '2', 'v' ) #define FOURCC_mp4v VLC_FOURCC( 'm', 'p', '4', 'v' ) #define FOURCC_mp4a VLC_FOURCC( 'm', 'p', '4', 'a' ) #define FOURCC_mp4s VLC_FOURCC( 'm', 'p', '4', 's' ) #define FOURCC_vide VLC_FOURCC( 'v', 'i', 'd', 'e' ) #define FOURCC_soun VLC_FOURCC( 's', 'o', 'u', 'n' ) #define FOURCC_hint VLC_FOURCC( 'h', 'i', 'n', 't' ) +#define FOURCC_hdv2 VLC_FOURCC( 'h', 'd', 'v', '2' ) #define FOURCC_dpnd VLC_FOURCC( 'd', 'p', 'n', 'd' ) #define FOURCC_ipir VLC_FOURCC( 'i', 'p', 'i', 'r' ) @@ -108,6 +114,10 @@ #define FOURCC_alaw VLC_FOURCC( 'a', 'l', 'a', 'w' ) #define FOURCC_ulaw VLC_FOURCC( 'u', 'l', 'a', 'w' ) #define FOURCC_Qclp VLC_FOURCC( 'Q', 'c', 'l', 'p' ) +#define FOURCC_samr VLC_FOURCC( 's', 'a', 'm', 'r' ) +#define FOURCC_sawb VLC_FOURCC( 's', 'a', 'w', 'b' ) +#define FOURCC_OggS VLC_FOURCC( 'O', 'g', 'g', 'S' ) +#define FOURCC_alac VLC_FOURCC( 'a', 'l', 'a', 'c' ) #define FOURCC_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' ) #define FOURCC_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' ) @@ -122,19 +132,33 @@ #define FOURCC_3VID VLC_FOURCC( '3', 'V', 'I', 'D' ) #define FOURCC_3vid VLC_FOURCC( '3', 'v', 'i', 'd' ) #define FOURCC_h263 VLC_FOURCC( 'h', '2', '6', '3' ) +#define FOURCC_s263 VLC_FOURCC( 's', '2', '6', '3' ) #define FOURCC_DIVX VLC_FOURCC( 'D', 'I', 'V', 'X' ) +#define FOURCC_XVID VLC_FOURCC( 'X', 'V', 'I', 'D' ) #define FOURCC_cvid VLC_FOURCC( 'c', 'v', 'i', 'd' ) #define FOURCC_mjpa VLC_FOURCC( 'm', 'j', 'p', 'a' ) #define FOURCC_mjpb VLC_FOURCC( 'm', 'j', 'q', 't' ) #define FOURCC_mjqt VLC_FOURCC( 'm', 'j', 'h', 't' ) #define FOURCC_mjht VLC_FOURCC( 'm', 'j', 'p', 'b' ) +#define FOURCC_VP31 VLC_FOURCC( 'V', 'P', '3', '1' ) +#define FOURCC_vp31 VLC_FOURCC( 'v', 'p', '3', '1' ) +#define FOURCC_h264 VLC_FOURCC( 'h', '2', '6', '4' ) +#define FOURCC_qdrw VLC_FOURCC( 'q', 'd', 'r', 'w' ) + +#define FOURCC_avc1 VLC_FOURCC( 'a', 'v', 'c', '1' ) +#define FOURCC_avcC VLC_FOURCC( 'a', 'v', 'c', 'C' ) +#define FOURCC_m4ds VLC_FOURCC( 'm', '4', 'd', 's' ) #define FOURCC_dvc VLC_FOURCC( 'd', 'v', 'c', ' ' ) #define FOURCC_dvp VLC_FOURCC( 'd', 'v', 'p', ' ' ) +#define FOURCC_dv5n VLC_FOURCC( 'd', 'v', '5', 'n' ) +#define FOURCC_dv5p VLC_FOURCC( 'd', 'v', '5', 'p' ) #define FOURCC_raw VLC_FOURCC( 'r', 'a', 'w', ' ' ) #define FOURCC_jpeg VLC_FOURCC( 'j', 'p', 'e', 'g' ) +#define FOURCC_yv12 VLC_FOURCC( 'y', 'v', '1', '2' ) +#define FOURCC_yuv2 VLC_FOURCC( 'y', 'u', 'v', '2' ) #define FOURCC_rmra VLC_FOURCC( 'r', 'm', 'r', 'a' ) #define FOURCC_rmda VLC_FOURCC( 'r', 'm', 'd', 'a' ) @@ -145,28 +169,65 @@ #define FOURCC_rmqu VLC_FOURCC( 'r', 'm', 'q', 'u' ) #define FOURCC_alis VLC_FOURCC( 'a', 'l', 'i', 's' ) +#define FOURCC_gmhd VLC_FOURCC( 'g', 'm', 'h', 'd' ) +#define FOURCC_wave VLC_FOURCC( 'w', 'a', 'v', 'e' ) + +#define FOURCC_drms VLC_FOURCC( 'd', 'r', 'm', 's' ) +#define FOURCC_sinf VLC_FOURCC( 's', 'i', 'n', 'f' ) +#define FOURCC_schi VLC_FOURCC( 's', 'c', 'h', 'i' ) +#define FOURCC_user VLC_FOURCC( 'u', 's', 'e', 'r' ) +#define FOURCC_key VLC_FOURCC( 'k', 'e', 'y', ' ' ) +#define FOURCC_iviv VLC_FOURCC( 'i', 'v', 'i', 'v' ) +#define FOURCC_name VLC_FOURCC( 'n', 'a', 'm', 'e' ) +#define FOURCC_priv VLC_FOURCC( 'p', 'r', 'i', 'v' ) + +#define FOURCC_text VLC_FOURCC( 't', 'e', 'x', 't' ) +#define FOURCC_tx3g VLC_FOURCC( 't', 'x', '3', 'g' ) +#define FOURCC_subp VLC_FOURCC( 's', 'u', 'b', 'p' ) + +#define FOURCC_0xa9nam VLC_FOURCC( 0xa9, 'n', 'a', 'm' ) +#define FOURCC_0xa9aut VLC_FOURCC( 0xa9, 'a', 'u', 't' ) +#define FOURCC_0xa9swr VLC_FOURCC( 0xa9, 's', 'w', 'r' ) +#define FOURCC_0xa9cpy VLC_FOURCC( 0xa9, 'c', 'p', 'y' ) +#define FOURCC_0xa9inf VLC_FOURCC( 0xa9, 'i', 'n', 'f' ) +#define FOURCC_0xa9ART VLC_FOURCC( 0xa9, 'A', 'R', 'T' ) +#define FOURCC_0xa9des VLC_FOURCC( 0xa9, 'd', 'e', 's' ) +#define FOURCC_0xa9dir VLC_FOURCC( 0xa9, 'd', 'i', 'r' ) +#define FOURCC_0xa9cmt VLC_FOURCC( 0xa9, 'c', 'm', 't' ) +#define FOURCC_0xa9req VLC_FOURCC( 0xa9, 'r', 'e', 'q' ) +#define FOURCC_0xa9day VLC_FOURCC( 0xa9, 'd', 'a', 'y' ) +#define FOURCC_0xa9fmt VLC_FOURCC( 0xa9, 'f', 'm', 't' ) +#define FOURCC_0xa9prd VLC_FOURCC( 0xa9, 'p', 'r', 'd' ) +#define FOURCC_0xa9prf VLC_FOURCC( 0xa9, 'p', 'r', 'f' ) +#define FOURCC_0xa9src VLC_FOURCC( 0xa9, 's', 'r', 'c' ) +#define FOURCC_0xa9alb VLC_FOURCC( 0xa9, 'a', 'l', 'b' ) +#define FOURCC_0xa9dis VLC_FOURCC( 0xa9, 'd', 'i', 's' ) +#define FOURCC_0xa9enc VLC_FOURCC( 0xa9, 'e', 'n', 'c' ) +#define FOURCC_0xa9trk VLC_FOURCC( 0xa9, 't', 'r', 'k' ) +#define FOURCC_0xa9url VLC_FOURCC( 0xa9, 'u', 'r', 'l' ) +#define FOURCC_0xa9dsa VLC_FOURCC( 0xa9, 'd', 's', 'a' ) +#define FOURCC_0xa9hst VLC_FOURCC( 0xa9, 'h', 's', 't' ) +#define FOURCC_0xa9ope VLC_FOURCC( 0xa9, 'o', 'p', 'e' ) +#define FOURCC_0xa9wrt VLC_FOURCC( 0xa9, 'w', 'r', 't' ) +#define FOURCC_0xa9com VLC_FOURCC( 0xa9, 'c', 'o', 'm' ) +#define FOURCC_0xa9gen VLC_FOURCC( 0xa9, 'g', 'e', 'n' ) +#define FOURCC_chpl VLC_FOURCC( 'c', 'h', 'p', 'l' ) +#define FOURCC_WLOC VLC_FOURCC( 'W', 'L', 'O', 'C' ) + +#define FOURCC_meta VLC_FOURCC( 'm', 'e', 't', 'a' ) +#define FOURCC_ilst VLC_FOURCC( 'i', 'l', 's', 't' ) + +#define FOURCC_chap VLC_FOURCC( 'c', 'h', 'a', 'p' ) + /* Do you want some debug information on all read boxes ? */ #define MP4_VERBOSE 1 -/* memory stream and file stream object */ - -typedef struct MP4_Stream_s -{ - int b_memory; /* do we uses a memory buffer */ - - input_thread_t *p_input; - - off_t i_start; /* in the buffer position for memory stream */ - off_t i_stop; - uint8_t *p_buffer; -} MP4_Stream_t; - struct MP4_Box_s; /* uuid Universal Unique IDentifiers */ -typedef struct UUID_s +typedef struct UUID_s { uint8_t b[16]; } UUID_t; @@ -187,7 +248,7 @@ typedef struct MP4_Box_data_mvhd_s { uint8_t i_version; uint32_t i_flags; - + uint64_t i_creation_time; uint64_t i_modification_time; uint32_t i_timescale; @@ -210,30 +271,30 @@ typedef struct MP4_Box_data_tkhd_s { uint8_t i_version; uint32_t i_flags; - + uint64_t i_creation_time; uint64_t i_modification_time; uint32_t i_track_ID; uint32_t i_reserved; uint64_t i_duration; - + uint32_t i_reserved2[2]; int16_t i_layer; int16_t i_predefined; - + int16_t i_volume; uint16_t i_reserved3; int32_t i_matrix[9]; int32_t i_width; int32_t i_height; - + } MP4_Box_data_tkhd_t; typedef struct MP4_Box_data_mdhd_s { uint8_t i_version; uint32_t i_flags; - + uint64_t i_creation_time; uint64_t i_modification_time; uint32_t i_timescale; @@ -241,7 +302,7 @@ typedef struct MP4_Box_data_mdhd_s /* one bit for pad */ /* unsigned int(5)[3] language difference with 0x60*/ - unsigned char i_language[3]; + unsigned char i_language[3]; uint16_t i_predefined; } MP4_Box_data_mdhd_t; @@ -250,12 +311,12 @@ typedef struct MP4_Box_data_hdlr_s { uint8_t i_version; uint32_t i_flags; - + uint32_t i_predefined; - uint32_t i_handler_type; /* "vide" "soun" "hint" "odsm" - "crsm" "sdsm" "m7sm" "ocsm" + uint32_t i_handler_type; /* "vide" "soun" "hint" "odsm" + "crsm" "sdsm" "m7sm" "ocsm" "ipsm" "mjsm" */ - + unsigned char *psz_name; /* in UTF-8 */ } MP4_Box_data_hdlr_t; @@ -264,9 +325,9 @@ typedef struct MP4_Box_data_vmhd_s { uint8_t i_version; uint32_t i_flags; - + int16_t i_graphics_mode; - int16_t i_opcolor[3]; + int16_t i_opcolor[3]; } MP4_Box_data_vmhd_t; @@ -274,7 +335,7 @@ typedef struct MP4_Box_data_smhd_s { uint8_t i_version; uint32_t i_flags; - + int16_t i_balance; int16_t i_reserved; @@ -284,7 +345,7 @@ typedef struct MP4_Box_data_hmhd_s { uint8_t i_version; uint32_t i_flags; - + uint16_t i_max_PDU_size; uint16_t i_avg_PDU_size; uint32_t i_max_bitrate; @@ -297,9 +358,9 @@ typedef struct MP4_Box_data_url_s { uint8_t i_version; uint32_t i_flags; - - unsigned char *psz_location; - + + char *psz_location; + } MP4_Box_data_url_t; typedef struct MP4_Box_data_urn_s @@ -307,9 +368,9 @@ typedef struct MP4_Box_data_urn_s uint8_t i_version; uint32_t i_flags; - unsigned char *psz_name; - unsigned char *psz_location; - + char *psz_name; + char *psz_location; + } MP4_Box_data_urn_t; typedef struct MP4_Box_data_dref_s @@ -336,7 +397,7 @@ typedef struct MP4_Box_data_ctts_s { uint8_t i_version; uint32_t i_flags; - + uint32_t i_entry_count; uint32_t *i_sample_count; /* these are array */ @@ -372,6 +433,8 @@ typedef struct MP4_Box_data_sample_soun_s int i_qt_description; uint8_t *p_qt_description; + void *p_drms; + } MP4_Box_data_sample_soun_t; typedef struct MP4_Box_data_sample_vide_s @@ -406,6 +469,47 @@ typedef struct MP4_Box_data_sample_vide_s } MP4_Box_data_sample_vide_t; +#define MP4_TEXT_DISPLAY_FLAG_DONT_DISPLAY (1<<0) +#define MP4_TEXT_DISPLAY_FLAG_AUTO_SCALE (1<<1) +#define MP4_TEXT_DISPLAY_FLAG_CLIP_TO_TEXT_BOX (1<<2) +#define MP4_TEXT_DISPLAY_FLAG_USE_MOVIE_BG_COLOR (1<<3) +#define MP4_TEXT_DISPLAY_FLAG_SHRINK_TEXT_BOX_TO_FIT (1<<4) +#define MP4_TEXT_DISPLAY_FLAG_SCROLL_IN (1<<5) +#define MP4_TEXT_DISPLAY_FLAG_SCROLL_OUT (1<<6) +#define MP4_TEXT_DISPLAY_FLAG_HORIZONTAL_SCROLL (1<<7) +#define MP4_TEXT_DISPLAY_FLAG_REVERSE_SCROLL (1<<8) +#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_SCROLL (1<<9) +#define MP4_TEXT_DISPLAY_FLAG_FLOW_HORIZONTAL (1<<10) +#define MP4_TEXT_DISPLAY_FLAG_CONTINUOUS_KARAOKE (1<<11) +#define MP4_TEXT_DISPLAY_FLAG_DROP_SHADOW (1<<12) +#define MP4_TEXT_DISPLAY_FLAG_ANTI_ALIAS (1<<13) +#define MP4_TEXT_DISPLAY_FLAG_KEYED_TEXT (1<<14) +#define MP4_TEXT_DISPLAY_FLAG_INVERSE_HILITE (1<<15) +#define MP4_TEXT_DISPLAY_FLAG_COLOR_HILITE (1<<16) +#define MP4_TEXT_DISPLAY_FLAG_WRITE_VERTICALLY (1<<17) + +typedef struct +{ + uint32_t i_reserved1; + uint16_t i_reserved2; + + uint16_t i_data_reference_index; + + uint32_t i_display_flags; // TextDescription and Tx3gDescription + + int8_t i_justification_horizontal; // left(0), centered(1), right(-1) + int8_t i_justification_vertical; // top(0), centered(1), bottom(-1) + + uint16_t i_background_color[4]; + + uint16_t i_text_box_top; + uint16_t i_text_box_left; + uint16_t i_text_box_bottom; + uint16_t i_text_box_right; + + // TODO to complete +} MP4_Box_data_sample_text_t; + typedef struct MP4_Box_data_sample_hint_s { uint8_t i_reserved1[6]; @@ -428,11 +532,11 @@ typedef struct MP4_Box_data_stsd_s { uint8_t i_version; uint32_t i_flags; - + uint32_t i_entry_count; /* it contains SampleEntry handled as if it was Box */ - + } MP4_Box_data_stsd_t; @@ -443,7 +547,7 @@ typedef struct MP4_Box_data_stsz_s uint32_t i_sample_size; uint32_t i_sample_count; - + uint32_t *i_entry_size; /* array , empty if i_sample_size != 0 */ } MP4_Box_data_stsz_t; @@ -471,7 +575,7 @@ typedef struct MP4_Box_data_stsc_s uint32_t *i_first_chunk; /* theses are arrays */ uint32_t *i_samples_per_chunk; uint32_t *i_sample_description_index; - + } MP4_Box_data_stsc_t; @@ -481,7 +585,7 @@ typedef struct MP4_Box_data_co64_s uint32_t i_flags; uint32_t i_entry_count; - + uint64_t *i_chunk_offset; } MP4_Box_data_co64_t; @@ -491,11 +595,11 @@ typedef struct MP4_Box_data_stss_s { uint8_t i_version; uint32_t i_flags; - + uint32_t i_entry_count; - + uint32_t *i_sample_number; - + } MP4_Box_data_stss_t; typedef struct MP4_Box_data_stsh_s @@ -504,7 +608,7 @@ typedef struct MP4_Box_data_stsh_s uint32_t i_flags; uint32_t i_entry_count; - + uint32_t *i_shadowed_sample_number; uint32_t *i_sync_sample_number; @@ -530,7 +634,7 @@ typedef struct MP4_Box_data_padb_s uint16_t *i_pad2; /* 3bits */ uint16_t *i_reserved2; /* 1bit */ uint16_t *i_pad1; /* 3bits */ - + } MP4_Box_data_padb_t; @@ -547,7 +651,7 @@ typedef struct MP4_Box_data_elst_s uint16_t *i_media_rate_integer; uint16_t *i_media_rate_fraction; - + } MP4_Box_data_elst_t; typedef struct MP4_Box_data_cprt_s @@ -556,8 +660,8 @@ typedef struct MP4_Box_data_cprt_s uint32_t i_flags; /* 1 pad bit */ unsigned char i_language[3]; - - unsigned char *psz_notice; + + char *psz_notice; } MP4_Box_data_cprt_t; @@ -570,18 +674,18 @@ typedef struct MP4_descriptor_decoder_config_s int i_buffer_sizeDB; int i_max_bitrate; int i_avg_bitrate; - + int i_decoder_specific_info_len; uint8_t *p_decoder_specific_info; /* some other stuff */ - + } MP4_descriptor_decoder_config_t; typedef struct MP4_descriptor_SL_config_s { int i_dummy; /* ANSI C forbids empty structures */ - + } MP4_descriptor_SL_config_t; @@ -599,7 +703,7 @@ typedef struct MP4_descriptor_ES_s uint16_t i_OCR_ES_ID; /* if b_OCRstream */ MP4_descriptor_decoder_config_t *p_decConfigDescr; - + MP4_descriptor_SL_config_t *p_slConfigDescr; /* some other stuff ... */ @@ -611,16 +715,16 @@ typedef struct MP4_Box_data_esds_s { uint8_t i_version; uint32_t i_flags; - + MP4_descriptor_ES_t es_descriptor; - + } MP4_Box_data_esds_t; typedef struct MP4_Box_data_dcom_s { uint32_t i_algorithm; /* fourcc */ - + } MP4_Box_data_dcom_t; typedef struct MP4_Box_data_cmvd_s @@ -639,7 +743,7 @@ typedef struct MP4_Box_data_cmov_s } MP4_Box_data_cmov_t; -typedef struct MP4_Box_data_rdrf_s +typedef struct { uint8_t i_version; uint32_t i_flags; @@ -649,7 +753,7 @@ typedef struct MP4_Box_data_rdrf_s } MP4_Box_data_rdrf_t; -typedef struct MP4_Box_data_rmdr_s +typedef struct { uint8_t i_version; uint32_t i_flags; @@ -658,7 +762,7 @@ typedef struct MP4_Box_data_rmdr_s } MP4_Box_data_rmdr_t; -typedef struct MP4_Box_data_rmvc_s +typedef struct { uint8_t i_version; uint32_t i_flags; @@ -671,7 +775,7 @@ typedef struct MP4_Box_data_rmvc_s } MP4_Box_data_rmvc_t; -typedef struct MP4_Box_data_rmcd_s +typedef struct { uint8_t i_version; uint32_t i_flags; @@ -679,12 +783,63 @@ typedef struct MP4_Box_data_rmcd_s } MP4_Box_data_rmcd_t; -typedef struct MP4_Box_data_rmqu_s +typedef struct { uint32_t i_quality; } MP4_Box_data_rmqu_t; +typedef struct +{ + char *psz_text; + +} MP4_Box_data_0xa9xxx_t; + +typedef struct +{ + uint32_t i_entry_count; + uint32_t *i_track_ID; + +} MP4_Box_data_tref_generic_t; + +typedef struct +{ + uint8_t i_version; + uint32_t i_flags; + + uint8_t i_chapter; + struct + { + char *psz_name; + int64_t i_start; + } chapter[256]; +} MP4_Box_data_chpl_t; + +typedef struct +{ + uint8_t i_version; + uint8_t i_profile; + uint8_t i_profile_compatibility; + uint8_t i_level; + + uint8_t i_reserved1; /* 6 bits */ + uint8_t i_length_size; + + uint8_t i_reserved2; /* 3 bits */ + uint8_t i_sps; + uint16_t *i_sps_length; + uint8_t **sps; + + uint8_t i_pps; + uint16_t *i_pps_length; + uint8_t **pps; + + /* XXX: Hack raw avcC atom payload */ + int i_avcC; + uint8_t *p_avcC; + +} MP4_Box_data_avcC_t; + /* typedef struct MP4_Box_data__s { @@ -713,9 +868,11 @@ typedef union MP4_Box_data_s MP4_Box_data_stsd_t *p_stsd; MP4_Box_data_sample_vide_t *p_sample_vide; MP4_Box_data_sample_soun_t *p_sample_soun; + MP4_Box_data_sample_text_t *p_sample_text; MP4_Box_data_sample_hint_t *p_sample_hint; MP4_Box_data_esds_t *p_esds; + MP4_Box_data_avcC_t *p_avcC; MP4_Box_data_stsz_t *p_stsz; MP4_Box_data_stz2_t *p_stz2; @@ -739,6 +896,10 @@ typedef union MP4_Box_data_s MP4_Box_data_rmqu_t *p_rmqu; MP4_Box_data_rmvc_t *p_rmvc; + MP4_Box_data_0xa9xxx_t *p_0xa9xxx; + MP4_Box_data_chpl_t *p_chpl; + MP4_Box_data_tref_generic_t *p_tref_generic; + void *p_data; /* for unknow type */ } MP4_Box_data_t; @@ -748,15 +909,15 @@ typedef union MP4_Box_data_s typedef struct MP4_Box_s { off_t i_pos; /* absolute position */ - + uint32_t i_type; uint32_t i_shortsize; UUID_t i_uuid; /* Set if i_type == "uuid" */ - + uint64_t i_size; /* always set so use it */ - MP4_Box_data_t data; /* union of pointers on extended data depending + MP4_Box_data_t data; /* union of pointers on extended data depending on i_type (or i_usertype) */ struct MP4_Box_s *p_father; /* pointer on the father Box */ @@ -768,44 +929,30 @@ typedef struct MP4_Box_s } MP4_Box_t; -/*---------------------------------------------------------------------------*/ -/* */ -/****----------------------- High level functions ------------------------****/ -/* */ -/*---------------------------------------------------------------------------*/ - -/***************************************************************************** - * Function for manipulate stream easily - *****************************************************************************/ -off_t MP4_TellAbsolute( input_thread_t *p_input ); -int MP4_SeekAbsolute( input_thread_t *p_input, off_t i_pos); -int MP4_ReadData( input_thread_t *p_input, uint8_t *p_buff, int i_size ); /***************************************************************************** * MP4_BoxGetRoot : Parse the entire file, and create all boxes in memory ***************************************************************************** - * The first box is a virtual box "root" and is the father for all first - * level boxes - * - * RETURN : 1 if succes and 0 if it failed + * The first box is a virtual box "root" and is the father for all first + * level boxes *****************************************************************************/ -int MP4_BoxGetRoot( input_thread_t *p_input, MP4_Box_t *p_root ); +MP4_Box_t *MP4_BoxGetRoot( stream_t * ); /***************************************************************************** * MP4_FreeBox : free memory allocated after read with MP4_ReadBox * or MP4_BoxGetRoot, this means also children boxes - * XXX : all children have to be allocated by a malloc !! and - * p_box isn't freeing + * XXX : all children have to be allocated by a malloc !! and + * p_box is freed *****************************************************************************/ -void MP4_BoxFree( input_thread_t *p_input, MP4_Box_t *p_box ); +void MP4_BoxFree( stream_t *, MP4_Box_t *p_box ); /***************************************************************************** * MP4_DumpBoxStructure: print the structure of the p_box ***************************************************************************** * Usefull while debugging *****************************************************************************/ -void MP4_BoxDumpStructure( input_thread_t *p_input, MP4_Box_t *p_box ); +void MP4_BoxDumpStructure( stream_t *p_input, MP4_Box_t *p_box ); /***************************************************************************** @@ -813,142 +960,25 @@ void MP4_BoxDumpStructure( input_thread_t *p_input, MP4_Box_t *p_box ); ***************************************************************************** * Path Format: . .. / as usual * [number] to specifie box number ex: trak[12] - * + * * ex: /moov/trak[12] - * ../mdia + * ../mdia *****************************************************************************/ -MP4_Box_t *MP4_BoxGet( MP4_Box_t *p_box, char *psz_fmt, ... ); - +MP4_Box_t *MP4_BoxGet( MP4_Box_t *p_box, const char *psz_fmt, ... ); + /***************************************************************************** * MP4_BoxCount: find number of box given a path relative to p_box ***************************************************************************** * Path Format: . .. / as usual * [number] to specifie box number ex: trak[12] - * + * * ex: /moov/trak - * ../mdia + * ../mdia *****************************************************************************/ -int MP4_BoxCount( MP4_Box_t *p_box, char *psz_fmt, ... ); +int MP4_BoxCount( MP4_Box_t *p_box, const char *psz_fmt, ... ); +int MP4_ReadBoxCommon( stream_t *p_stream, MP4_Box_t *p_box ); +int MP4_ReadBox_sample_vide( stream_t *p_stream, MP4_Box_t *p_box ); +void MP4_FreeBox_sample_vide( MP4_Box_t *p_box ); - -/*---------------------------------------------------------------------------*/ -/* */ -/****---------------------- Medium level functions -----------------------****/ -/* */ -/*---------------------------------------------------------------------------*/ - -#if 0 -/***************************************************************************** - * MP4_CountBox: given a box, count how many child have the requested type - * FIXME : support GUUID - *****************************************************************************/ -int MP4_CountBox( MP4_Box_t *p_box, uint32_t i_type ); -#endif - -/***************************************************************************** - * MP4_FindBox: find first box with i_type child of p_box - * return NULL if not found - *****************************************************************************/ -MP4_Box_t *MP4_FindBox( MP4_Box_t *p_box, uint32_t i_type ); - -#if 0 -/***************************************************************************** - * MP4_FindNextBox: find next box with thesame type and at the same level - * than p_box - *****************************************************************************/ -MP4_Box_t *MP4_FindNextBox( MP4_Box_t *p_box ); - -/***************************************************************************** - * MP4_FindNbBox: find the box i_number - *****************************************************************************/ -MP4_Box_t *MP4_FindNbBox( MP4_Box_t *p_box, uint32_t i_number ); #endif - -/*---------------------------------------------------------------------------*/ -/****----------------------- Lower level functions -----------------------****/ -/**** ****/ -/****------Use them only when you known what they really do and need------****/ -/**** ****/ -/****---------------------------------------------------------------------****/ -/*---------------------------------------------------------------------------*/ - - -/**** ------- First some function to make abstract from input -------- */ - -/**************************************************************************** - * MP4_InputStream create an stram with an input - * - ****************************************************************************/ -MP4_Stream_t *MP4_InputStream( input_thread_t *p_input ); - -/**************************************************************************** - * MP4_MemoryStream create a memory stream - * if p_buffer == NULL, will allocate a buffer of i_size, else - * it uses p_buffer XXX you have to unallocate yourself ! - * - ****************************************************************************/ -MP4_Stream_t *MP4_MemoryStream( input_thread_t *p_input, - int i_size, uint8_t *p_buffer ); - -/**************************************************************************** - * MP4_ReadStream read from a MP4_Stream_t - * - ****************************************************************************/ -int MP4_ReadStream( MP4_Stream_t *p_stream, uint8_t *p_buff, int i_size ); - -/**************************************************************************** - * MP4_PeekStream guess it ;) - * - ****************************************************************************/ -int MP4_PeekStream( MP4_Stream_t *p_stream, uint8_t **pp_peek, int i_size ); - -/**************************************************************************** - * MP4_TellStream give absolute position in the stream - * XXX for a memory stream give position from begining of the buffer - ****************************************************************************/ -off_t MP4_TellStream( MP4_Stream_t *p_stream ); - -/**************************************************************************** - * MP4_SeekStream seek in a MP4_Stream_t - * - ****************************************************************************/ -int MP4_SeekStream( MP4_Stream_t *p_stream, off_t i_pos); - - - -/***************************************************************************** - * MP4_ReadBox : parse the actual box and the children if they exist - * - * RETURN : 1 if succes and 0 if it failed - *****************************************************************************/ -int MP4_ReadBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box, MP4_Box_t *p_father ); - - -/***************************************************************************** - * MP4_ReadBoxCommon : Load only common parameters for all boxes - ***************************************************************************** - * p_box need to be an already allocated MP4_Box_t, and all data - * will only be peek not read - * - * RETURN : 0 if it fail, 1 otherwise - *****************************************************************************/ -int MP4_ReadBoxCommon( MP4_Stream_t *p_stream, MP4_Box_t *p_box ); - - -/***************************************************************************** - * MP4_MP4_GotoBox : Go to this particular box - ***************************************************************************** - * RETURN : 0 if it fail, 1 otherwise - *****************************************************************************/ -int MP4_GotoBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box ); - - -/***************************************************************************** - * MP4_MP4_NextBox : Go to the next box wiithin p_box->p_father - ***************************************************************************** - * if p_box == NULL, go to the next box in witch we are( at the begining ). - *****************************************************************************/ -int MP4_NextBox( MP4_Stream_t *p_stream, MP4_Box_t *p_box ); - -