X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=modules%2Fdemux%2Fmp4%2Flibmp4.h;h=902e6a40990e2e45bdcbfb9f58074f1538e0f49e;hb=245aa5862555d70e49c7d1659fee253ab3483465;hp=f310743f587b9f8affda62ee493b818da4e825c1;hpb=b5a213db24b2ea69eacd84822991236fed8938c4;p=vlc diff --git a/modules/demux/mp4/libmp4.h b/modules/demux/mp4/libmp4.h index f310743f58..902e6a4099 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.12 2003/05/07 02:31:20 fenrir Exp $ + * Copyright (C) 2001-2004, 2010 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,9 +17,12 @@ * * 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' ) @@ -28,7 +31,7 @@ #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' ) @@ -66,7 +69,6 @@ #define FOURCC_padb VLC_FOURCC( 'p', 'a', 'd', 'b' ) #define FOURCC_edts VLC_FOURCC( 'e', 'd', 't', 's' ) #define FOURCC_elst VLC_FOURCC( 'e', 'l', 's', 't' ) -#define FOURCC_udta VLC_FOURCC( 'u', 'd', 't', 'a' ) #define FOURCC_mvex VLC_FOURCC( 'm', 'v', 'e', 'x' ) #define FOURCC_trex VLC_FOURCC( 't', 'r', 'e', 'x' ) #define FOURCC_mfhd VLC_FOURCC( 'm', 'f', 'h', 'd' ) @@ -77,12 +79,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' ) @@ -91,6 +95,7 @@ #define FOURCC_rtp VLC_FOURCC( 'r', 't', 'p', ' ' ) #define FOURCC_isom VLC_FOURCC( 'i', 's', 'o', 'm' ) +#define FOURCC_3gp4 VLC_FOURCC( '3', 'g', 'p', '4' ) #define FOURCC_esds VLC_FOURCC( 'e', 's', 'd', 's' ) #define FOURCC__mp3 VLC_FOURCC( '.', 'm', 'p', '3' ) @@ -110,6 +115,14 @@ #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_dac3 VLC_FOURCC( 'd', 'a', 'c', '3' ) +#define FOURCC_dec3 VLC_FOURCC( 'd', 'e', 'c', '3' ) +#define FOURCC_enda VLC_FOURCC( 'e', 'n', 'd', 'a' ) +#define FOURCC_gnre VLC_FOURCC( 'g', 'n', 'r', 'e' ) +#define FOURCC_trkn VLC_FOURCC( 't', 'r', 'k', 'n' ) #define FOURCC_zlib VLC_FOURCC( 'z', 'l', 'i', 'b' ) #define FOURCC_SVQ1 VLC_FOURCC( 'S', 'V', 'Q', '1' ) @@ -126,18 +139,31 @@ #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' ) @@ -148,28 +174,76 @@ #define FOURCC_rmqu VLC_FOURCC( 'r', 'm', 'q', 'u' ) #define FOURCC_alis VLC_FOURCC( 'a', 'l', 'i', 's' ) -/* Do you want some debug information on all read boxes ? */ -#define MP4_VERBOSE 1 - -/* memory stream and file stream object */ +#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_drmi VLC_FOURCC( 'd', 'r', 'm', 'i' ) +#define FOURCC_frma VLC_FOURCC( 'f', 'r', 'm', 'a' ) +#define FOURCC_skcr VLC_FOURCC( 's', 'k', 'c', 'r' ) + +#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_sbtl VLC_FOURCC( 's', 'b', 't', 'l' ) + +#define FOURCC_0xa9nam VLC_FOURCC( 0xa9, 'n', 'a', 'm' ) +#define FOURCC_0xa9aut VLC_FOURCC( 0xa9, 'a', 'u', 't' ) +#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_0xa9too VLC_FOURCC( 0xa9, 't', 'o', 'o' ) +#define FOURCC_0xa9wrn VLC_FOURCC( 0xa9, 'w', 'r', 'n' ) +#define FOURCC_0xa9swr VLC_FOURCC( 0xa9, 's', 'w', 'r' ) +#define FOURCC_0xa9mak VLC_FOURCC( 0xa9, 'm', 'a', 'k' ) +#define FOURCC_0xa9mod VLC_FOURCC( 0xa9, 'm', 'o', 'd' ) +#define FOURCC_0xa9PRD VLC_FOURCC( 0xa9, 'P', 'R', 'D' ) +#define FOURCC_0xa9grp VLC_FOURCC( 0xa9, 'g', 'r', 'p' ) +#define FOURCC_0xa9lyr VLC_FOURCC( 0xa9, 'g', 'r', 'p' ) +#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' ) -typedef struct MP4_Stream_s -{ - int b_memory; /* do we uses a memory buffer */ +/* Do you want some debug information on all read boxes ? */ +//#define MP4_VERBOSE 1 - 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; @@ -190,7 +264,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; @@ -213,38 +287,39 @@ 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; uint64_t i_duration; /* one bit for pad */ + uint16_t i_language_code; /* 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; @@ -253,12 +328,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; @@ -267,9 +342,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; @@ -277,7 +352,7 @@ typedef struct MP4_Box_data_smhd_s { uint8_t i_version; uint32_t i_flags; - + int16_t i_balance; int16_t i_reserved; @@ -287,7 +362,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; @@ -300,9 +375,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 @@ -310,9 +385,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 @@ -339,7 +414,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 */ @@ -375,6 +450,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 @@ -407,8 +484,51 @@ typedef struct MP4_Box_data_sample_vide_s int i_qt_image_description; uint8_t *p_qt_image_description; + void *p_drms; + } 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]; @@ -431,11 +551,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; @@ -446,7 +566,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; @@ -474,7 +594,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; @@ -484,7 +604,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; @@ -494,11 +614,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 @@ -507,7 +627,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; @@ -533,7 +653,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; @@ -550,7 +670,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 @@ -559,8 +679,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; @@ -573,18 +693,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; @@ -602,7 +722,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 ... */ @@ -614,16 +734,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 @@ -642,7 +762,19 @@ typedef struct MP4_Box_data_cmov_s } MP4_Box_data_cmov_t; -typedef struct MP4_Box_data_rdrf_s +typedef struct +{ + uint32_t i_type; +} MP4_Box_data_frma_t; + +typedef struct +{ + uint32_t i_init; + uint32_t i_encr; + uint32_t i_decr; +} MP4_Box_data_skcr_t; + +typedef struct { uint8_t i_version; uint32_t i_flags; @@ -652,7 +784,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; @@ -661,7 +793,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; @@ -674,7 +806,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; @@ -682,12 +814,164 @@ 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 MP4_Box_data_mfhd_s +{ + uint32_t i_sequence_number; + + uint8_t *p_vendor_extension; + +} MP4_Box_data_mfhd_t; + +#define MP4_TFHD_BASE_DATA_OFFSET (1LL<<0) +#define MP4_TFHD_SAMPLE_DESC_INDEX (1LL<<1) +#define MP4_TFHD_DFLT_SAMPLE_DURATION (1LL<<3) +#define MP4_TFHD_DFLT_SAMPLE_SIZE (1LL<<4) +#define MP4_TFHD_DFLT_SAMPLE_FLAGS (1LL<<5) +typedef struct MP4_Box_data_tfhd_s +{ + uint8_t i_version; + uint32_t i_flags; + uint32_t i_track_ID; + + /* optional fields */ + uint64_t i_base_data_offset; + uint32_t i_sample_description_index; + uint32_t i_default_sample_duration; + uint32_t i_default_sample_size; + uint32_t i_default_sample_flags; + +} MP4_Box_data_tfhd_t; + +#define MP4_TRUN_DATA_OFFSET (1<<0) +#define MP4_TRUN_FIRST_FLAGS (1<<2) +#define MP4_TRUN_SAMPLE_DURATION (1<<8) +#define MP4_TRUN_SAMPLE_SIZE (1<<9) +#define MP4_TRUN_SAMPLE_FLAGS (1<<10) +#define MP4_TRUN_SAMPLE_TIME_OFFSET (1<<11) +typedef struct MP4_descriptor_trun_sample_t +{ + uint32_t i_duration; + uint32_t i_size; + uint32_t i_flags; + uint32_t i_composition_time_offset; +} MP4_descriptor_trun_sample_t; + +typedef struct MP4_Box_data_trun_s +{ + uint8_t i_version; + uint32_t i_flags; + uint32_t i_sample_count; + + /* optional fields */ + uint32_t i_data_offset; + uint32_t i_first_sample_flags; + + MP4_descriptor_trun_sample_t *p_samples; + +} MP4_Box_data_trun_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 +{ + uint8_t i_fscod; + uint8_t i_bsid; + uint8_t i_bsmod; + uint8_t i_acmod; + uint8_t i_lfeon; + uint8_t i_bitrate_code; + +} MP4_Box_data_dac3_t; + +typedef struct +{ + uint16_t i_little_endian; + +} MP4_Box_data_enda_t; + +typedef struct +{ + uint16_t i_genre; + +} MP4_Box_data_gnre_t; + +typedef struct +{ + uint32_t i_track_number; + uint32_t i_track_total; + +} MP4_Box_data_trkn_t; + +typedef struct +{ + uint8_t i_version; + uint32_t i_flags; + + uint16_t i_object_descriptor; + uint8_t i_OD_profile_level; + uint8_t i_scene_profile_level; + uint8_t i_audio_profile_level; + uint8_t i_visual_profile_level; + uint8_t i_graphics_profile_level; + +} MP4_Box_data_iods_t; + /* typedef struct MP4_Box_data__s { @@ -702,6 +986,9 @@ typedef union MP4_Box_data_s { MP4_Box_data_ftyp_t *p_ftyp; MP4_Box_data_mvhd_t *p_mvhd; + MP4_Box_data_mfhd_t *p_mfhd; + MP4_Box_data_tfhd_t *p_tfhd; + MP4_Box_data_trun_t *p_trun; MP4_Box_data_tkhd_t *p_tkhd; MP4_Box_data_mdhd_t *p_mdhd; MP4_Box_data_hdlr_t *p_hdlr; @@ -714,11 +1001,18 @@ typedef union MP4_Box_data_s MP4_Box_data_stts_t *p_stts; MP4_Box_data_ctts_t *p_ctts; 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_hint_t *p_sample_hint; - - MP4_Box_data_esds_t *p_esds; + 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_dac3_t *p_dac3; + MP4_Box_data_enda_t *p_enda; + MP4_Box_data_gnre_t *p_gnre; + MP4_Box_data_trkn_t *p_trkn; + MP4_Box_data_iods_t *p_iods; MP4_Box_data_stsz_t *p_stsz; MP4_Box_data_stz2_t *p_stz2; @@ -737,11 +1031,18 @@ typedef union MP4_Box_data_s MP4_Box_data_moviehintinformation_rtp_t p_moviehintinformation_rtp; + MP4_Box_data_frma_t *p_frma; + MP4_Box_data_skcr_t *p_skcr; + MP4_Box_data_rdrf_t *p_rdrf; MP4_Box_data_rmdr_t *p_rmdr; 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; @@ -751,15 +1052,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 */ @@ -771,187 +1072,56 @@ 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 + * Useful 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 ); /***************************************************************************** * MP4_BoxGet: find a box given a path relative to 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, ... ); -/*---------------------------------------------------------------------------*/ -/* */ -/****---------------------- Medium level functions -----------------------****/ -/* */ -/*---------------------------------------------------------------------------*/ +/* Internal functions exposed for MKV demux */ +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 ); -#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 ); - -