~ubuntu-dev/mplayer/ubuntu-feisty

« back to all changes in this revision

Viewing changes to libmpdemux/asf.h

  • Committer: Reinhard Tartler
  • Date: 2006-07-08 08:45:33 UTC
  • Revision ID: siretart@tauware.de-20060708084533-dbc155bde7122e78
imported mplayer_0.99+1.0pre7try2+cvs20060117

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#ifndef __ASF_H
 
2
#define __ASF_H
 
3
 
 
4
//#include "config.h"   /* for WORDS_BIGENDIAN */
 
5
#include <inttypes.h>
 
6
#include "bswap.h"
 
7
 
 
8
#ifndef MIN
 
9
#define MIN(a,b) (((a)<(b))?(a):(b))
 
10
#endif
 
11
 
 
12
///////////////////////
 
13
// MS GUID definition
 
14
///////////////////////
 
15
#ifndef GUID_DEFINED
 
16
#define GUID_DEFINED
 
17
// Size of GUID is 16 bytes!
 
18
typedef struct __attribute__((packed)) {
 
19
        uint32_t        Data1;          // 4 bytes
 
20
        uint16_t        Data2;          // 2 bytes
 
21
        uint16_t        Data3;          // 2 bytes
 
22
        uint8_t         Data4[8];       // 8 bytes
 
23
} GUID_t;
 
24
#endif
 
25
 
 
26
///////////////////////
 
27
// ASF Object Header 
 
28
///////////////////////
 
29
typedef struct __attribute__((packed)) {
 
30
  uint8_t guid[16];
 
31
  uint64_t size;
 
32
} ASF_obj_header_t;
 
33
 
 
34
////////////////
 
35
// ASF Header 
 
36
////////////////
 
37
typedef struct __attribute__((packed)) {
 
38
  ASF_obj_header_t objh;
 
39
  uint32_t cno; // number of subchunks
 
40
  uint8_t v1; // unknown (0x01)
 
41
  uint8_t v2; // unknown (0x02)
 
42
} ASF_header_t;
 
43
 
 
44
/////////////////////
 
45
// ASF File Header 
 
46
/////////////////////
 
47
typedef struct __attribute__((packed)) {
 
48
  uint8_t stream_id[16]; // stream GUID
 
49
  uint64_t file_size;
 
50
  uint64_t creation_time; //File creation time FILETIME 8
 
51
  uint64_t num_packets;    //Number of packets UINT64 8
 
52
  uint64_t play_duration; //Timestamp of the end position UINT64 8
 
53
  uint64_t send_duration;  //Duration of the playback UINT64 8
 
54
  uint64_t preroll; //Time to bufferize before playing UINT32 4
 
55
  uint32_t flags; //Unknown, maybe flags ( usually contains 2 ) UINT32 4
 
56
  uint32_t min_packet_size; //Min size of the packet, in bytes UINT32 4
 
57
  uint32_t max_packet_size; //Max size of the packet  UINT32 4
 
58
  uint32_t max_bitrate; //Maximum bitrate of the media (sum of all the stream)
 
59
} ASF_file_header_t;
 
60
 
 
61
///////////////////////
 
62
// ASF Stream Header
 
63
///////////////////////
 
64
typedef struct __attribute__((packed)) {
 
65
  uint8_t type[16]; // Stream type (audio/video) GUID 16
 
66
  uint8_t concealment[16]; // Audio error concealment type GUID 16
 
67
  uint64_t unk1; // Unknown, maybe reserved ( usually contains 0 ) UINT64 8
 
68
  uint32_t type_size; //Total size of type-specific data UINT32 4
 
69
  uint32_t stream_size; //Size of stream-specific data UINT32 4
 
70
  uint16_t stream_no; //Stream number UINT16 2
 
71
  uint32_t unk2; //Unknown UINT32 4
 
72
} ASF_stream_header_t;
 
73
 
 
74
///////////////////////////
 
75
// ASF Content Description
 
76
///////////////////////////
 
77
typedef struct  __attribute__((packed)) {
 
78
  uint16_t title_size;
 
79
  uint16_t author_size;
 
80
  uint16_t copyright_size;
 
81
  uint16_t comment_size;
 
82
  uint16_t rating_size;
 
83
} ASF_content_description_t;
 
84
 
 
85
////////////////////////
 
86
// ASF Segment Header 
 
87
////////////////////////
 
88
typedef struct __attribute__((packed)) {
 
89
  uint8_t streamno;
 
90
  uint8_t seq;
 
91
  uint32_t x;
 
92
  uint8_t flag;
 
93
} ASF_segmhdr_t;
 
94
 
 
95
//////////////////////
 
96
// ASF Stream Chunck
 
97
//////////////////////
 
98
typedef struct __attribute__((packed)) {
 
99
        uint16_t        type;
 
100
        uint16_t        size;
 
101
        uint32_t        sequence_number;
 
102
        uint16_t        unknown;
 
103
        uint16_t        size_confirm;
 
104
} ASF_stream_chunck_t;
 
105
 
 
106
// Definition of the stream type
 
107
#ifdef WORDS_BIGENDIAN
 
108
        #define ASF_STREAMING_CLEAR     0x2443          // $C
 
109
        #define ASF_STREAMING_DATA      0x2444          // $D
 
110
        #define ASF_STREAMING_END_TRANS 0x2445          // $E
 
111
        #define ASF_STREAMING_HEADER    0x2448          // $H
 
112
#else
 
113
        #define ASF_STREAMING_CLEAR     0x4324          // $C
 
114
        #define ASF_STREAMING_DATA      0x4424          // $D
 
115
        #define ASF_STREAMING_END_TRANS 0x4524          // $E
 
116
        #define ASF_STREAMING_HEADER    0x4824          // $H
 
117
#endif
 
118
 
 
119
// Definition of the differents type of ASF streaming
 
120
typedef enum {
 
121
        ASF_Unknown_e,
 
122
        ASF_Live_e,
 
123
        ASF_Prerecorded_e,
 
124
        ASF_Redirector_e,
 
125
        ASF_PlainText_e,
 
126
        ASF_Authenticate_e
 
127
} ASF_StreamType_e;
 
128
 
 
129
typedef struct {
 
130
        ASF_StreamType_e streaming_type;
 
131
        int request;
 
132
        int packet_size;
 
133
        int *audio_streams,n_audio,*video_streams,n_video;
 
134
        int audio_id, video_id;
 
135
} asf_http_streaming_ctrl_t;
 
136
 
 
137
 
 
138
/*
 
139
 * Some macros to swap little endian structures read from an ASF file
 
140
 * into machine endian format
 
141
 */
 
142
#ifdef WORDS_BIGENDIAN
 
143
#define le2me_ASF_obj_header_t(h) {                                     \
 
144
    (h)->size = le2me_64((h)->size);                                    \
 
145
}
 
146
#define le2me_ASF_header_t(h) {                                         \
 
147
    le2me_ASF_obj_header_t(&(h)->objh);                                 \
 
148
    (h)->cno = le2me_32((h)->cno);                                      \
 
149
}
 
150
#define le2me_ASF_stream_header_t(h) {                                  \
 
151
    (h)->unk1 = le2me_64((h)->unk1);                                    \
 
152
    (h)->type_size = le2me_32((h)->type_size);                          \
 
153
    (h)->stream_size = le2me_32((h)->stream_size);                      \
 
154
    (h)->stream_no = le2me_16((h)->stream_no);                          \
 
155
    (h)->unk2 = le2me_32((h)->unk2);                                    \
 
156
}
 
157
#define le2me_ASF_file_header_t(h) {                                    \
 
158
    (h)->file_size = le2me_64((h)->file_size);                          \
 
159
    (h)->creation_time = le2me_64((h)->creation_time);                  \
 
160
    (h)->num_packets = le2me_64((h)->num_packets);                      \
 
161
    (h)->play_duration = le2me_64((h)->play_duration);                  \
 
162
    (h)->send_duration = le2me_64((h)->send_duration);                  \
 
163
    (h)->preroll = le2me_64((h)->preroll);                              \
 
164
    (h)->flags = le2me_32((h)->flags);                                  \
 
165
    (h)->min_packet_size = le2me_32((h)->min_packet_size);              \
 
166
    (h)->max_packet_size = le2me_32((h)->max_packet_size);              \
 
167
    (h)->max_bitrate = le2me_32((h)->max_bitrate);                      \
 
168
}
 
169
#define le2me_ASF_content_description_t(h) {                            \
 
170
    (h)->title_size = le2me_16((h)->title_size);                        \
 
171
    (h)->author_size = le2me_16((h)->author_size);                      \
 
172
    (h)->copyright_size = le2me_16((h)->copyright_size);                \
 
173
    (h)->comment_size = le2me_16((h)->comment_size);                    \
 
174
    (h)->rating_size = le2me_16((h)->rating_size);                      \
 
175
}
 
176
#define le2me_BITMAPINFOHEADER(h) {                                     \
 
177
    (h)->biSize = le2me_32((h)->biSize);                                \
 
178
    (h)->biWidth = le2me_32((h)->biWidth);                              \
 
179
    (h)->biHeight = le2me_32((h)->biHeight);                            \
 
180
    (h)->biPlanes = le2me_16((h)->biPlanes);                            \
 
181
    (h)->biBitCount = le2me_16((h)->biBitCount);                        \
 
182
    (h)->biCompression = le2me_32((h)->biCompression);                  \
 
183
    (h)->biSizeImage = le2me_32((h)->biSizeImage);                      \
 
184
    (h)->biXPelsPerMeter = le2me_32((h)->biXPelsPerMeter);              \
 
185
    (h)->biYPelsPerMeter = le2me_32((h)->biYPelsPerMeter);              \
 
186
    (h)->biClrUsed = le2me_32((h)->biClrUsed);                          \
 
187
    (h)->biClrImportant = le2me_32((h)->biClrImportant);                \
 
188
}
 
189
#define le2me_WAVEFORMATEX(h) {                                         \
 
190
    (h)->wFormatTag = le2me_16((h)->wFormatTag);                        \
 
191
    (h)->nChannels = le2me_16((h)->nChannels);                          \
 
192
    (h)->nSamplesPerSec = le2me_32((h)->nSamplesPerSec);                \
 
193
    (h)->nAvgBytesPerSec = le2me_32((h)->nAvgBytesPerSec);              \
 
194
    (h)->nBlockAlign = le2me_16((h)->nBlockAlign);                      \
 
195
    (h)->wBitsPerSample = le2me_16((h)->wBitsPerSample);                \
 
196
    (h)->cbSize = le2me_16((h)->cbSize);                                \
 
197
}
 
198
#define le2me_ASF_stream_chunck_t(h) {                                  \
 
199
    (h)->size = le2me_16((h)->size);                                    \
 
200
    (h)->sequence_number = le2me_32((h)->sequence_number);              \
 
201
    (h)->unknown = le2me_16((h)->unknown);                              \
 
202
    (h)->size_confirm = le2me_16((h)->size_confirm);                    \
 
203
}
 
204
#else
 
205
#define le2me_ASF_obj_header_t(h)       /**/
 
206
#define le2me_ASF_header_t(h)           /**/
 
207
#define le2me_ASF_stream_header_t(h)    /**/
 
208
#define le2me_ASF_file_header_t(h)      /**/
 
209
#define le2me_ASF_content_description_t(h) /**/
 
210
#define le2me_BITMAPINFOHEADER(h)   /**/
 
211
#define le2me_WAVEFORMATEX(h)       /**/
 
212
#define le2me_ASF_stream_chunck_t(h) /**/
 
213
#endif
 
214
 
 
215
#endif