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 uint16_t stream_language_index; 46 47} ASFStream; 48 49typedef uint8_t ff_asf_guid[16]; 50 51typedef struct { 52 ff_asf_guid guid; ///< generated by client computer 53 uint64_t file_size; /**< in bytes 54 * invalid if broadcasting */ 55 uint64_t create_time; /**< time of creation, in 100-nanosecond units since 1.1.1601 56 * invalid if broadcasting */ 57 uint64_t play_time; /**< play time, in 100-nanosecond units 58 * invalid if broadcasting */ 59 uint64_t send_time; /**< time to send file, in 100-nanosecond units 60 * invalid if broadcasting (could be ignored) */ 61 uint32_t preroll; /**< timestamp of the first packet, in milliseconds 62 * if nonzero - subtract from time */ 63 uint32_t ignore; ///< preroll is 64bit - but let's just ignore it 64 uint32_t flags; /**< 0x01 - broadcast 65 * 0x02 - seekable 66 * rest is reserved should be 0 */ 67 uint32_t min_pktsize; /**< size of a data packet 68 * invalid if broadcasting */ 69 uint32_t max_pktsize; /**< shall be the same as for min_pktsize 70 * invalid if broadcasting */ 71 uint32_t max_bitrate; /**< bandwidth of stream in bps 72 * should be the sum of bitrates of the 73 * individual media streams */ 74} ASFMainHeader; 75 76 77typedef struct { 78 uint32_t packet_number; 79 uint16_t packet_count; 80} ASFIndex; 81 82 83typedef struct { 84 uint32_t seqno; 85 int is_streamed; 86 int asfid2avid[128]; ///< conversion table from asf ID 2 AVStream ID 87 ASFStream streams[128]; ///< it's max number and it's not that big 88 uint32_t stream_bitrates[128]; ///< max number of streams, bitrate for each (for streaming) 89 char stream_languages[128][6]; ///< max number of streams, language for each (RFC1766, e.g. en-US) 90 /* non streamed additonnal info */ 91 uint64_t nb_packets; ///< how many packets are there in the file, invalid if broadcasting 92 int64_t duration; ///< in 100ns units 93 /* packet filling */ 94 unsigned char multi_payloads_present; 95 int packet_size_left; 96 int packet_timestamp_start; 97 int packet_timestamp_end; 98 unsigned int packet_nb_payloads; 99 int packet_nb_frames; 100 uint8_t packet_buf[PACKET_SIZE]; 101 ByteIOContext pb; 102 /* only for reading */ 103 uint64_t data_offset; ///< beginning of the first data packet 104 uint64_t data_object_offset; ///< data object offset (excl. GUID & size) 105 uint64_t data_object_size; ///< size of the data object 106 int index_read; 107 108 ASFMainHeader hdr; 109 110 int packet_flags; 111 int packet_property; 112 int packet_timestamp; 113 int packet_segsizetype; 114 int packet_segments; 115 int packet_seq; 116 int packet_replic_size; 117 int packet_key_frame; 118 int packet_padsize; 119 unsigned int packet_frag_offset; 120 unsigned int packet_frag_size; 121 int64_t packet_frag_timestamp; 122 int packet_multi_size; 123 int packet_obj_size; 124 int packet_time_delta; 125 int packet_time_start; 126 int64_t packet_pos; 127 128 int stream_index; 129 130 131 int64_t last_indexed_pts; 132 ASFIndex* index_ptr; 133 uint32_t nb_index_count; 134 uint32_t nb_index_memory_alloc; 135 uint16_t maximum_packet; 136 137 ASFStream* asf_st; ///< currently decoded stream 138} ASFContext; 139 140extern const ff_asf_guid ff_asf_header; 141extern const ff_asf_guid ff_asf_file_header; 142extern const ff_asf_guid ff_asf_stream_header; 143extern const ff_asf_guid ff_asf_ext_stream_header; 144extern const ff_asf_guid ff_asf_audio_stream; 145extern const ff_asf_guid ff_asf_audio_conceal_none; 146extern const ff_asf_guid ff_asf_audio_conceal_spread; 147extern const ff_asf_guid ff_asf_video_stream; 148extern const ff_asf_guid ff_asf_video_conceal_none; 149extern const ff_asf_guid ff_asf_command_stream; 150extern const ff_asf_guid ff_asf_comment_header; 151extern const ff_asf_guid ff_asf_codec_comment_header; 152extern const ff_asf_guid ff_asf_codec_comment1_header; 153extern const ff_asf_guid ff_asf_data_header; 154extern const ff_asf_guid ff_asf_head1_guid; 155extern const ff_asf_guid ff_asf_head2_guid; 156extern const ff_asf_guid ff_asf_extended_content_header; 157extern const ff_asf_guid ff_asf_simple_index_header; 158extern const ff_asf_guid ff_asf_ext_stream_embed_stream_header; 159extern const ff_asf_guid ff_asf_ext_stream_audio_stream; 160extern const ff_asf_guid ff_asf_metadata_header; 161extern const ff_asf_guid ff_asf_marker_header; 162extern const ff_asf_guid ff_asf_my_guid; 163extern const ff_asf_guid ff_asf_language_guid; 164extern const ff_asf_guid ff_asf_content_encryption; 165extern const ff_asf_guid ff_asf_ext_content_encryption; 166extern const ff_asf_guid ff_asf_digital_signature; 167 168extern const AVMetadataConv ff_asf_metadata_conv[]; 169 170#define ASF_PACKET_FLAG_ERROR_CORRECTION_PRESENT 0x80 //1000 0000 171 172 173// ASF data packet structure 174// ========================= 175// 176// 177// ----------------------------------- 178// | Error Correction Data | Optional 179// ----------------------------------- 180// | Payload Parsing Information (PPI) | 181// ----------------------------------- 182// | Payload Data | 183// ----------------------------------- 184// | Padding Data | 185// ----------------------------------- 186 187 188// PPI_FLAG - Payload parsing information flags 189#define ASF_PPI_FLAG_MULTIPLE_PAYLOADS_PRESENT 1 190 191#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_BYTE 0x02 //0000 0010 192#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_WORD 0x04 //0000 0100 193#define ASF_PPI_FLAG_SEQUENCE_FIELD_IS_DWORD 0x06 //0000 0110 194#define ASF_PPI_MASK_SEQUENCE_FIELD_SIZE 0x06 //0000 0110 195 196#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_BYTE 0x08 //0000 1000 197#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_WORD 0x10 //0001 0000 198#define ASF_PPI_FLAG_PADDING_LENGTH_FIELD_IS_DWORD 0x18 //0001 1000 199#define ASF_PPI_MASK_PADDING_LENGTH_FIELD_SIZE 0x18 //0001 1000 200 201#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_BYTE 0x20 //0010 0000 202#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_WORD 0x40 //0100 0000 203#define ASF_PPI_FLAG_PACKET_LENGTH_FIELD_IS_DWORD 0x60 //0110 0000 204#define ASF_PPI_MASK_PACKET_LENGTH_FIELD_SIZE 0x60 //0110 0000 205 206// PL_FLAG - Payload flags 207#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_BYTE 0x01 //0000 0001 208#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_WORD 0x02 //0000 0010 209#define ASF_PL_FLAG_REPLICATED_DATA_LENGTH_FIELD_IS_DWORD 0x03 //0000 0011 210#define ASF_PL_MASK_REPLICATED_DATA_LENGTH_FIELD_SIZE 0x03 //0000 0011 211 212#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_BYTE 0x04 //0000 0100 213#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_WORD 0x08 //0000 1000 214#define ASF_PL_FLAG_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_IS_DWORD 0x0c //0000 1100 215#define ASF_PL_MASK_OFFSET_INTO_MEDIA_OBJECT_LENGTH_FIELD_SIZE 0x0c //0000 1100 216 217#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_BYTE 0x10 //0001 0000 218#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_WORD 0x20 //0010 0000 219#define ASF_PL_FLAG_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_IS_DWORD 0x30 //0011 0000 220#define ASF_PL_MASK_MEDIA_OBJECT_NUMBER_LENGTH_FIELD_SIZE 0x30 //0011 0000 221 222#define ASF_PL_FLAG_STREAM_NUMBER_LENGTH_FIELD_IS_BYTE 0x40 //0100 0000 223#define ASF_PL_MASK_STREAM_NUMBER_LENGTH_FIELD_SIZE 0xc0 //1100 0000 224 225#define ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_BYTE 0x40 //0100 0000 226#define ASF_PL_FLAG_PAYLOAD_LENGTH_FIELD_IS_WORD 0x80 //1000 0000 227#define ASF_PL_MASK_PAYLOAD_LENGTH_FIELD_SIZE 0xc0 //1100 0000 228 229#define ASF_PL_FLAG_KEY_FRAME 0x80 //1000 0000 230 231extern AVInputFormat asf_demuxer; 232int ff_put_str16_nolen(ByteIOContext *s, const char *tag); 233 234#endif /* AVFORMAT_ASF_H */ 235