1/* 2 * Copyright (c) 2000, 2001 Fabrice Bellard 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21#ifndef AVFORMAT_ASF_H 22#define AVFORMAT_ASF_H 23 24#include <stdint.h> 25#include "avformat.h" 26#include "metadata.h" 27 28#define PACKET_SIZE 3200 29 30typedef struct { 31 int num; 32 unsigned char seq; 33 /* use for reading */ 34 AVPacket pkt; 35 int frag_offset; 36 int timestamp; 37 int64_t duration; 38 39 int ds_span; /* descrambling */ 40 int ds_packet_size; 41 int ds_chunk_size; 42 43 int64_t packet_pos; 44 45} ASFStream; 46 47typedef uint8_t GUID[16]; 48 49typedef struct { 50 GUID guid; ///< generated by client computer 51 uint64_t file_size; /**< in bytes 52 * invalid if broadcasting */ 53 uint64_t create_time; /**< time of creation, in 100-nanosecond units since 1.1.1601 54 * invalid if broadcasting */ 55 uint64_t play_time; /**< play time, in 100-nanosecond units 56 * invalid if broadcasting */ 57 uint64_t send_time; /**< time to send file, in 100-nanosecond units 58 * invalid if broadcasting (could be ignored) */ 59 uint32_t preroll; /**< timestamp of the first packet, in milliseconds 60 * if nonzero - subtract from time */ 61 uint32_t ignore; ///< preroll is 64bit - but let's just ignore it 62 uint32_t flags; /**< 0x01 - broadcast 63 * 0x02 - seekable 64 * rest is reserved should be 0 */ 65 uint32_t min_pktsize; /**< size of a data packet 66 * invalid if broadcasting */ 67 uint32_t max_pktsize; /**< shall be the same as for min_pktsize 68 * invalid if broadcasting */ 69 uint32_t max_bitrate; /**< bandwith of stream in bps 70 * should be the sum of bitrates of the 71 * individual media streams */ 72} ASFMainHeader; 73 74 75typedef struct { 76 uint32_t packet_number; 77 uint16_t packet_count; 78} ASFIndex; 79 80 81typedef struct { 82 uint32_t seqno; 83 int is_streamed; 84 int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID 85 ASFStream streams[128]; ///< it's max number and it's not that big 86 uint32_t stream_bitrates[128]; ///< max number of streams, bitrate for each (for streaming) 87 /* non streamed additonnal info */ 88 uint64_t nb_packets; ///< how many packets are there in the file, invalid if broadcasting 89 int64_t duration; ///< in 100ns units 90 /* packet filling */ 91 unsigned char multi_payloads_present; 92 int packet_size_left; 93 int packet_timestamp_start; 94 int packet_timestamp_end; 95 unsigned int packet_nb_payloads; 96 int packet_nb_frames; 97 uint8_t packet_buf[PACKET_SIZE]; 98 ByteIOContext pb; 99 /* only for reading */ 100 uint64_t data_offset; ///< beginning of the first data packet 101 uint64_t data_object_offset; ///< data object offset (excl. GUID & size) 102 uint64_t data_object_size; ///< size of the data object 103 int index_read; 104 105 ASFMainHeader hdr; 106 107 int packet_flags; 108 int packet_property; 109 int packet_timestamp; 110 int packet_segsizetype; 111 int packet_segments; 112 int packet_seq; 113 int packet_replic_size; 114 int packet_key_frame; 115 int packet_padsize; 116 unsigned int packet_frag_offset; 117 unsigned int packet_frag_size; 118 int64_t packet_frag_timestamp; 119 int packet_multi_size; 120 int packet_obj_size; 121 int packet_time_delta; 122 int packet_time_start; 123 int64_t packet_pos; 124 125 int stream_index; 126 127 128 int64_t last_indexed_pts; 129 ASFIndex* index_ptr; 130 uint32_t nb_index_count; 131 uint32_t nb_index_memory_alloc; 132 uint16_t maximum_packet; 133 134 ASFStream* asf_st; ///< currently decoded stream 135} ASFContext; 136 137extern const GUID ff_asf_header; 138extern const GUID ff_asf_file_header; 139extern const GUID ff_asf_stream_header; 140extern const GUID ff_asf_ext_stream_header; 141extern const GUID ff_asf_audio_stream; 142extern const GUID ff_asf_audio_conceal_none; 143extern const GUID ff_asf_audio_conceal_spread; 144extern const GUID ff_asf_video_stream; 145extern const GUID ff_asf_video_conceal_none; 146extern const GUID ff_asf_command_stream; 147extern const GUID ff_asf_comment_header; 148extern const GUID ff_asf_codec_comment_header; 149extern const GUID ff_asf_codec_comment1_header; 150extern const GUID ff_asf_data_header; 151extern const GUID ff_asf_head1_guid; 152extern const GUID ff_asf_head2_guid; 153extern const GUID ff_asf_extended_content_header; 154extern const GUID ff_asf_simple_index_header; 155extern const GUID ff_asf_ext_stream_embed_stream_header; 156extern const GUID ff_asf_ext_stream_audio_stream; 157extern const GUID ff_asf_metadata_header; 158extern const GUID ff_asf_my_guid; 159 160extern const AVMetadataConv ff_asf_metadata_conv[]; 161 162#define ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT 0x80 //1000 0000 163 164 165// ASF data packet structure 166// ========================= 167// 168// 169// ----------------------------------- 170// | Error Correction Data | Optional 171// ----------------------------------- 172// | Payload Parsing Information (PPI) | 173// ----------------------------------- 174// | Payload Data | 175// ----------------------------------- 176// | Padding Data | 177// ----------------------------------- 178 179 180// PPI_FLAG - Payload parsing information flags 181#define ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT 1 182 183#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_BYTE 0x02 //0000 0010 184#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_WORD 0x04 //0000 0100 185#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_DWORD 0x06 //0000 0110 186#define ASF_PPI_MASK_SEQUENCE_FIELD_SIZE 0x06 //0000 0110 187 188#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_BYTE 0x08 //0000 1000 189#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_WORD 0x10 //0001 0000 190#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_DWORD 0x18 //0001 1000 191#define ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE 0x18 //0001 1000 192 193#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_BYTE 0x20 //0010 0000 194#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_WORD 0x40 //0100 0000 195#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_DWORD 0x60 //0110 0000 196#define ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE 0x60 //0110 0000 197 198// PL_FLAG - Payload flags 199#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_BYTE 0x01 //0000 0001 200#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_WORD 0x02 //0000 0010 201#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_DWORD 0x03 //0000 0011 202#define ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE 0x03 //0000 0011 203 204#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_BYTE 0x04 //0000 0100 205#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_WORD 0x08 //0000 1000 206#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_DWORD 0x0c //0000 1100 207#define ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE 0x0c //0000 1100 208 209#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_BYTE 0x10 //0001 0000 210#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_WORD 0x20 //0010 0000 211#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_DWORD 0x30 //0011 0000 212#define ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE 0x30 //0011 0000 213 214#define ASF_PL_FLAG_STREAM_NUMBER_LENGTH_FIELD_IS_BYTE 0x40 //0100 0000 215#define ASF_PL_MASK_STREAM_NUMBER_LENGTH_FIELD_SIZE 0xc0 //1100 0000 216 217#define ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_BYTE 0x40 //0100 0000 218#define ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_WORD 0x80 //1000 0000 219#define ASF_PL_MASK_PAYLOAD_LENGTH_FIELD_SIZE 0xc0 //1100 0000 220 221#define ASF_PL_FLAG_KEY_FRAME 0x80 //1000 0000 222 223extern AVInputFormat asf_demuxer; 224 225/** 226 * Load a single ASF packet into the demuxer. 227 * @param s demux context 228 * @param pb context to read data from 229 * @returns 0 on success, <0 on error 230 */ 231int ff_asf_get_packet(AVFormatContext *s, ByteIOContext *pb); 232 233/** 234 * Parse data from individual ASF packets (which were previously loaded 235 * with asf_get_packet()). 236 * @param s demux context 237 * @param pb context to read data from 238 * @param pkt pointer to store packet data into 239 * @returns 0 if data was stored in pkt, <0 on error or 1 if more ASF 240 * packets need to be loaded (through asf_get_packet()) 241 */ 242int ff_asf_parse_packet(AVFormatContext *s, ByteIOContext *pb, AVPacket *pkt); 243 244#endif /* AVFORMAT_ASF_H */ 245