30 #include "libavutil/channel_layout.h"
31 #include "libavutil/intreadwrite.h"
32 #include "libavutil/intfloat.h"
33 #include "libavutil/dict.h"
41 #define PRI_PRETTY_GUID \
42 "%08"PRIx32"-%04"PRIx16"-%04"PRIx16"-%02x%02x%02x%02x%02x%02x%02x%02x"
43 #define ARG_PRETTY_GUID(g) \
44 AV_RL32(g),AV_RL16(g+4),AV_RL16(g+6),g[8],g[9],g[10],g[11],g[12],g[13],g[14],g[15]
45 #define LEN_PRETTY_GUID 34
53 #define WTV_SECTOR_BITS 12
54 #define WTV_SECTOR_SIZE (1 << WTV_SECTOR_BITS)
55 #define WTV_BIGSECTOR_BITS 18
57 #define SHIFT_SECTOR_BITS(a) ((int64_t)(a) << WTV_SECTOR_BITS)
91 while(nread < buf_size) {
94 int read_request =
FFMIN(buf_size - nread, remaining_in_sector);
102 if (n == remaining_in_sector) {
125 else if (whence == SEEK_CUR)
127 else if (whence == SEEK_END)
147 for (i = 0; i < count; i++) {
183 }
else if (depth == 1) {
191 }
else if (depth == 2) {
202 for (i = 0; i < nb_sectors1; i++) {
221 length &= 0xFFFFFFFFFFFF;
255 {0x92,0xB7,0x74,0x91,0x59,0x70,0x70,0x44,0x88,0xDF,0x06,0x3B,0x82,0xCC,0x21,0x3D};
267 const uint8_t *buf_end = buf + buf_size;
269 while(buf + 48 <= buf_end) {
270 int dir_length, name_size, first_sector, depth;
271 uint64_t file_length;
275 "remaining directory entries ignored\n",
FF_ARG_GUID(buf));
278 dir_length =
AV_RL16(buf + 16);
279 file_length =
AV_RL64(buf + 24);
280 name_size = 2 *
AV_RL32(buf + 32);
283 "bad filename length, remaining directory entries ignored\n");
286 if (48 + name_size > buf_end - buf) {
287 av_log(s,
AV_LOG_ERROR,
"filename exceeds buffer size; remaining directory entries ignored\n");
290 first_sector =
AV_RL32(buf + 40 + name_size);
291 depth =
AV_RL32(buf + 44 + name_size);
295 if (name_size >= filename_size &&
296 !memcmp(name, filename, filename_size) &&
297 (name_size < filename_size + 2 || !
AV_RN16(name + filename_size)))
305 #define wtvfile_open(s, buf, buf_size, filename) \
306 wtvfile_open2(s, buf, buf_size, filename, sizeof(filename))
345 {0xB7,0xD8,0x00,0x20,0x37,0x49,0xDA,0x11,0xA6,0x4E,0x00,0x07,0xE9,0x5E,0xAD,0x8D};
347 {0x5A,0xFE,0xD7,0x6D,0xC8,0x1D,0x8F,0x4A,0x99,0x22,0xFA,0xB1,0x1C,0x38,0x14,0x53};
349 {0x5B,0x05,0xE6,0x1B,0x97,0xA9,0x49,0x43,0x88,0x17,0x1A,0x65,0x5A,0x29,0x8A,0x97};
351 {0x95,0xC3,0xD2,0xC2,0x7E,0x9A,0xDA,0x11,0x8B,0xF7,0x00,0x07,0xE9,0x5E,0xAD,0x8D};
353 {0xED,0xA4,0x13,0x23,0x2D,0xBF,0x4F,0x45,0xAD,0x8A,0xD9,0x5B,0xA7,0xF9,0x1F,0xEE};
355 {0xA2,0xC3,0xD2,0xC2,0x7E,0x9A,0xDA,0x11,0x8B,0xF7,0x00,0x07,0xE9,0x5E,0xAD,0x8D};
357 {0x48,0xC0,0xCE,0x5D,0xB9,0xD0,0x63,0x41,0x87,0x2C,0x4F,0x32,0x22,0x3B,0xE8,0x8A};
359 {0x6D,0x66,0x92,0xE2,0x02,0x9C,0x8D,0x44,0xAA,0x8D,0x78,0x1A,0x93,0xFD,0xC3,0x95};
361 {0x1C,0xD4,0x7B,0x10,0xDA,0xA6,0x91,0x46,0x83,0x69,0x11,0xB2,0xCD,0xAA,0x28,0x8E};
363 {0xE6,0xA2,0xB4,0x3A,0x47,0x42,0x34,0x4B,0x89,0x6C,0x30,0xAF,0xA5,0xD2,0x1C,0x24};
365 {0xD9,0x79,0xE7,0xEf,0xF0,0x97,0x86,0x47,0x80,0x0D,0x95,0xCF,0x50,0x5D,0xDC,0x66};
367 {0xC4,0xE1,0xD4,0x4B,0xA1,0x90,0x09,0x41,0x82,0x36,0x27,0xF0,0x0E,0x7D,0xCC,0x5B};
369 {0x68,0xAB,0xF1,0xCA,0x53,0xE1,0x41,0x4D,0xA6,0xB3,0xA7,0xC9,0x98,0xDB,0x75,0xEE};
371 {0x50,0xD9,0x99,0x95,0x33,0x5F,0x17,0x46,0xAF,0x7C,0x1E,0x54,0xB5,0x10,0xDA,0xA3};
373 {0xBE,0xBF,0x1C,0x50,0x49,0xB8,0xCE,0x42,0x9B,0xE9,0x3D,0xB8,0x69,0xFB,0x82,0xB3};
383 {0x81,0xEB,0x36,0xE4,0x4F,0x52,0xCE,0x11,0x9F,0x53,0x00,0x20,0xAF,0x0B,0xA7,0x70};
385 {0x6C,0x17,0x5F,0x45,0x06,0x4B,0xCE,0x47,0x9A,0xEF,0x8C,0xAE,0xF7,0x3D,0xF7,0xB5};
387 {0x20,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA};
389 {0x89,0x8A,0x8B,0xB8,0x49,0xB0,0x80,0x4C,0xAD,0xCF,0x58,0x98,0x98,0x5E,0x22,0xC1};
393 {0x28,0xBD,0xAD,0x46,0xD0,0x6F,0x96,0x47,0x93,0xB2,0x15,0x5C,0x51,0xDC,0x04,0x8D};
395 {0xC3,0xCB,0xFF,0x34,0xB3,0xD5,0x71,0x41,0x90,0x02,0xD4,0xC6,0x03,0x01,0x69,0x7F};
397 {0xE3,0x76,0x2A,0xF7,0x0A,0xEB,0xD0,0x11,0xAC,0xE4,0x00,0x00,0xC0,0xCC,0x16,0xBA};
399 {0xAA,0xDD,0x2A,0xF5,0xF0,0x36,0xF5,0x43,0x95,0xEA,0x6D,0x86,0x64,0x84,0x26,0x2A};
401 {0x79,0x85,0x9F,0x4A,0xF8,0x6B,0x92,0x43,0x8A,0x6D,0xD2,0xDD,0x09,0xFA,0x78,0x61};
405 {0x6F,0xB3,0x39,0x67,0x5F,0x1D,0xC2,0x4A,0x81,0x92,0x28,0xBB,0x0E,0x73,0xD1,0x6A};
407 {0x81,0x9F,0x58,0x05,0x56,0xC3,0xCE,0x11,0xBF,0x01,0x00,0xAA,0x00,0x55,0x59,0x5A};
409 {0xA0,0x76,0x2A,0xF7,0x0A,0xEB,0xD0,0x11,0xAC,0xE4,0x00,0x00,0xC0,0xCC,0x16,0xBA};
411 {0xE3,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA};
413 {0xD6,0x17,0x64,0x0F,0x18,0xC3,0xD0,0x11,0xA4,0x3F,0x00,0xA0,0xC9,0x22,0x31,0x96};
416 {
AV_CODEC_ID_MPEG2VIDEO, {0x26,0x80,0x6D,0xE0,0x46,0xDB,0xCF,0x11,0xB4,0xD1,0x00,0x80,0x5F,0x6C,0xBB,0xEA}},
430 time_t t = (value / 10000000LL) - 11644473600LL;
431 struct tm *tm = gmtime(&t);
433 strftime(buf, buf_size,
"%Y-%m-%d %H:%M:%S", gmtime(&t));
443 time_t t = (value / 10000000LL) - 719162LL*86400LL;
444 struct tm *tm = gmtime(&t);
446 strftime(buf, buf_size,
"%Y-%m-%d %H:%M:%S", gmtime(&t));
457 struct tm *tm = gmtime(&t);
459 strftime(buf, buf_size,
"%Y-%m-%d %H:%M:%S", gmtime(&t));
467 char description[1024];
468 unsigned int filesize;
473 if (strcmp(mime,
"image/jpeg"))
505 if (type == 0 && length == 4) {
506 snprintf(buf, buf_size,
"%u",
avio_rl32(pb));
507 }
else if (type == 1) {
513 }
else if (type == 3 && length == 4) {
514 strcpy(buf,
avio_rl32(pb) ?
"true" :
"false");
515 }
else if (type == 4 && length == 8) {
517 if (!strcmp(key,
"WM/EncodingTime") ||
518 !strcmp(key,
"WM/MediaOriginalBroadcastDateTime"))
520 else if (!strcmp(key,
"WM/WMRVEncodeTime") ||
521 !strcmp(key,
"WM/WMRVEndTime"))
523 else if (!strcmp(key,
"WM/WMRVExpirationDate"))
525 else if (!strcmp(key,
"WM/WMRVBitrate"))
528 snprintf(buf, buf_size,
"%"PRIi64, num);
529 }
else if (type == 5 && length == 2) {
530 snprintf(buf, buf_size,
"%u",
avio_rl16(pb));
531 }
else if (type == 6 && length == 16) {
535 }
else if (type == 2 && !strcmp(key,
"WM/Picture")) {
541 av_log(s,
AV_LOG_WARNING,
"unsupported metadata entry; key:%s, type:%d, length:0x%x\n", key, type, length);
566 "remaining metadata entries ignored\n",
FF_ARG_GUID(guid));
570 get_tag(s, pb, key, type, length);
677 st =
parse_media_type(s, st, sid, mediatype, actual_subtype, actual_formattype, size - 32);
784 int len, sid, consumed;
805 consumed += 92 +
size;
819 consumed += 76 +
size;
828 if (stream_index >= 0) {
842 buf_size =
FFMIN(len - consumed,
sizeof(buf));
844 consumed += buf_size;
849 if (stream_index >= 0) {
856 else if (audio_type == 3)
862 if (stream_index >= 0) {
865 av_log(s,
AV_LOG_WARNING,
"DVB scrambled stream detected (st:%d), decoding will likely fail\n", stream_index);
870 if (stream_index >= 0) {
878 if (!strcmp(language,
"nar") || !strcmp(language,
"NAR"))
885 if (stream_index >= 0) {
896 #define WTV_PAD8(x) (((x) + 7) & ~7)
904 if (mode ==
SEEK_TO_DATA && stream_index >= 0 && len > 32) {
913 !
ff_guidcmp(g, (
const ff_asf_guid){0x14,0x56,0x1A,0x0C,0xCD,0x30,0x40,0x4F,0xBC,0xBF,0xD0,0x3E,0x52,0x30,0x62,0x07}) ||
914 !
ff_guidcmp(g, (
const ff_asf_guid){0x02,0xAE,0x5B,0x2F,0x8F,0x7B,0x60,0x4F,0x82,0xD6,0xE4,0xEA,0x2F,0x1F,0x4C,0x99}) ||
915 !
ff_guidcmp(g, (
const ff_asf_guid){0x12,0xF6,0x22,0xB6,0xAD,0x47,0x71,0x46,0xAD,0x6C,0x05,0xA9,0x8E,0x65,0xDE,0x3A}) ||
916 !
ff_guidcmp(g, (
const ff_asf_guid){0xCC,0x32,0x64,0xDD,0x29,0xE2,0xDB,0x40,0x80,0xF6,0xD2,0x63,0x28,0xD2,0x76,0x1F}) ||
917 !
ff_guidcmp(g, (
const ff_asf_guid){0xE5,0xC5,0x67,0x90,0x5C,0x4C,0x05,0x42,0x86,0xC8,0x7A,0xFE,0x20,0xFE,0x1E,0xFA}) ||
918 !
ff_guidcmp(g, (
const ff_asf_guid){0x80,0x6D,0xF3,0x41,0x32,0x41,0xC2,0x4C,0xB1,0x21,0x01,0xA4,0x32,0x19,0xD8,0x1B}) ||
919 !
ff_guidcmp(g, (
const ff_asf_guid){0x51,0x1D,0xAB,0x72,0xD2,0x87,0x9B,0x48,0xBA,0x11,0x0E,0x08,0xDC,0x21,0x02,0x43}) ||
920 !
ff_guidcmp(g, (
const ff_asf_guid){0x65,0x8F,0xFC,0x47,0xBB,0xE2,0x34,0x46,0x9C,0xEF,0xFD,0xBF,0xE6,0x26,0x1D,0x5C}) ||
921 !
ff_guidcmp(g, (
const ff_asf_guid){0xCB,0xC5,0x68,0x80,0x04,0x3C,0x2B,0x49,0xB4,0x7D,0x03,0x08,0x82,0x0D,0xCE,0x51}) ||
922 !
ff_guidcmp(g, (
const ff_asf_guid){0xBC,0x2E,0xAF,0x82,0xA6,0x30,0x64,0x42,0xA8,0x0B,0xAD,0x2E,0x13,0x72,0xAC,0x60}) ||
923 !
ff_guidcmp(g, (
const ff_asf_guid){0x1E,0xBE,0xC3,0xC5,0x43,0x92,0xDC,0x11,0x85,0xE5,0x00,0x12,0x3F,0x6F,0x73,0xB9}) ||
924 !
ff_guidcmp(g, (
const ff_asf_guid){0x3B,0x86,0xA2,0xB1,0xEB,0x1E,0xC3,0x44,0x8C,0x88,0x1C,0xA3,0xFF,0xE3,0xE7,0x6A}) ||
925 !
ff_guidcmp(g, (
const ff_asf_guid){0x4E,0x7F,0x4C,0x5B,0xC4,0xD0,0x38,0x4B,0xA8,0x3E,0x21,0x7F,0x7B,0xBF,0x52,0xE7}) ||
926 !
ff_guidcmp(g, (
const ff_asf_guid){0x63,0x36,0xEB,0xFE,0xA1,0x7E,0xD9,0x11,0x83,0x08,0x00,0x07,0xE9,0x5E,0xAD,0x8D}) ||
927 !
ff_guidcmp(g, (
const ff_asf_guid){0x70,0xE9,0xF1,0xF8,0x89,0xA4,0x4C,0x4D,0x83,0x73,0xB8,0x12,0xE0,0xD5,0xF8,0x1E}) ||
928 !
ff_guidcmp(g, (
const ff_asf_guid){0x96,0xC3,0xD2,0xC2,0x7E,0x9A,0xDA,0x11,0x8B,0xF7,0x00,0x07,0xE9,0x5E,0xAD,0x8D}) ||
929 !
ff_guidcmp(g, (
const ff_asf_guid){0x97,0xC3,0xD2,0xC2,0x7E,0x9A,0xDA,0x11,0x8B,0xF7,0x00,0x07,0xE9,0x5E,0xAD,0x8D}) ||
930 !
ff_guidcmp(g, (
const ff_asf_guid){0xA1,0xC3,0xD2,0xC2,0x7E,0x9A,0xDA,0x11,0x8B,0xF7,0x00,0x07,0xE9,0x5E,0xAD,0x8D})) {
943 {
't'_'i'_'m'_'e'_'l'_'i'_'n'_'e', 0};
955 int root_sector, root_size;
958 int64_t timeline_pos;
968 if (root_size >
sizeof(root)) {
1027 if (frame_nb > e->
size)
1029 if (position > e->
pos)
1048 int stream_index,
len, ret;
1051 if (stream_index < 0)
1052 return stream_index;
1064 int64_t ts,
int flags)
1069 int64_t ts_relative;
1079 ts_relative -= wtv->
epoch;
#define WTV_BIGSECTOR_BITS
static int64_t seek_by_sector(AVIOContext *pb, int64_t sector, int64_t offset)
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
static const ff_asf_guid mediatype_video
static const AVCodecGuid video_guids[]
static AVIOContext * wtvfile_open2(AVFormatContext *s, const uint8_t *buf, int buf_size, const uint8_t *filename, int filename_size)
Open file using filename.
static const ff_asf_guid timestamp_guid
static const ff_asf_guid mediatype_audio
int64_t epoch
timeline file
static av_always_inline int ff_get_guid(AVIOContext *s, ff_asf_guid *g)
static void get_attachment(AVFormatContext *s, AVIOContext *pb, int length)
#define AV_LOG_WARNING
Something somehow does not look correct.
void * opaque
A private pointer, passed to the read/write/seek/...
static int parse_videoinfoheader2(AVFormatContext *s, AVStream *st)
parse VIDEOINFOHEADER2 structure
#define ARG_PRETTY_GUID(g)
AVCodecContext * codec
Codec context associated with this stream.
int sector_bits
file system (AVFormatContext->pb)
enum AVMediaType codec_type
static int64_t wtvfile_seek(void *opaque, int64_t offset, int whence)
void av_log(void *avcl, int level, const char *fmt,...) av_printf_format(3
Send the specified message to the log if the level is less than or equal to the current av_log_level...
int error
number of sectors
static void parse_legacy_attrib(AVFormatContext *s, AVIOContext *pb)
Parse metadata entries.
static const ff_asf_guid dir_entry_guid
static const ff_asf_guid stream_guid
#define AV_CH_LAYOUT_STEREO
static int read_packet(AVFormatContext *s, AVPacket *pkt)
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
void av_freep(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
static const ff_asf_guid mediatype_mpeg2_sections
static const ff_asf_guid mediatype_mstvcaption
static const ff_asf_guid stream2_guid
static const ff_asf_guid data_guid
unsigned char * buffer
Start of the buffer.
static const ff_asf_guid EVENTID_StreamIDSpanningEvent
static const ff_asf_guid EVENTID_SubtitleSpanningEvent
static const ff_asf_guid format_waveformatex
#define FF_MEDIASUBTYPE_BASE_GUID
static int read_probe(AVProbeData *p)
unsigned char * buf
Buffer must have AVPROBE_PADDING_SIZE of extra allocated bytes filled with zero.
static const ff_asf_guid EVENTID_DVBScramblingControlSpanningEvent
enum AVStreamParseType need_parsing
int id
Format-specific stream ID.
static const ff_asf_guid mediasubtype_dvb_subtitle
static const ff_asf_guid mediasubtype_teletext
#define AVERROR_EOF
End of file.
AVInputFormat ff_wtv_demuxer
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
AVStream * avformat_new_stream(AVFormatContext *s, const AVCodec *c)
Add a new stream to a media file.
static int wtvfile_read_packet(void *opaque, uint8_t *buf, int buf_size)
static const ff_asf_guid EVENTID_TeletextSpanningEvent
static const uint8_t timeline_table_0_entries_Events_le16[]
static void get_tag(AVFormatContext *s, AVIOContext *pb, const char *key, int type, int length)
#define SHIFT_SECTOR_BITS(a)
static int parse_chunks(AVFormatContext *s, int mode, int64_t seekts, int *len_ptr)
Parse WTV chunks.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
static const ff_asf_guid EVENTID_CSDescriptorSpanningEvent
AVIOContext * pb_filesystem
void * priv_data
Format private data.
int ff_get_wav_header(AVIOContext *pb, AVCodecContext *codec, int size)
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
preferred ID for decoding MPEG audio layer 1, 2 or 3
static int read_close(AVFormatContext *s)
static const ff_asf_guid mediatype_mpeg2_pes
static void parse_mpeg1waveformatex(AVStream *st)
Parse MPEG1WAVEFORMATEX extradata structure.
uint64_t channel_layout
Audio channel layout.
static const ff_asf_guid EVENTID_AudioDescriptorSpanningEvent
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
static const ff_asf_guid metadata_guid
int bit_rate
the average bitrate
static const ff_asf_guid format_mpeg2_video
const AVCodecTag ff_codec_bmp_tags[]
static const uint8_t table_0_entries_time_le16[]
AVStream ** streams
A list of all streams in the file.
void * av_malloc(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
internal header for RIFF based (de)muxers do NOT include this in end user applications ...
static const ff_asf_guid EVENTID_LanguageSpanningEvent
static const ff_asf_guid EVENTID_AudioTypeSpanningEvent
Opaque data information usually sparse.
preferred ID for MPEG-1/2 video decoding
const AVCodecGuid ff_codec_wav_guids[]
static const ff_asf_guid format_none
static const ff_asf_guid wtv_guid
static const ff_asf_guid EVENTID_CtxADescriptorSpanningEvent
static AVStream * new_stream(AVFormatContext *s, AVStream *st, int sid, int codec_type)
Initialise stream.
enum AVMediaType codec_type
static const ff_asf_guid mediasubtype_mpeg2_sections
AVIOContext * pb
I/O context.
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
static void wtvfile_close(AVIOContext *pb)
Close file opened with wtvfile_open_sector(), or wtv_open()
AVDictionary * metadata
Metadata that applies to the whole file.
static const ff_asf_guid mediasubtype_cpfilters_processed
static void filetime_to_iso8601(char *buf, int buf_size, int64_t value)
Convert win32 FILETIME to ISO-8601 string.
const AVMetadataConv ff_asf_metadata_conv[]
static void crazytime_to_iso8601(char *buf, int buf_size, int64_t value)
Convert crazy time (100ns since 1 Jan 0001) to ISO-8601 string.
static const ff_asf_guid mediasubtype_mpeg1payload
int error
contains the error code or 0 if no error happened
This structure contains the data a format has to probe a file.
unsigned int index_entries_allocated_size
static const ff_asf_guid format_videoinfo2
static const ff_asf_guid format_cpfilters_processed
int ff_parse_mpeg2_descriptor(AVFormatContext *fc, AVStream *st, int stream_type, const uint8_t **pp, const uint8_t *desc_list_end, Mp4Descr *mp4_descr, int mp4_descr_count, int pid, MpegTSContext *ts)
Parse an MPEG-2 descriptor.
int64_t duration
Decoding: duration of the stream, in stream time base.
static av_always_inline double av_int2double(uint64_t i)
Reinterpret a 64-bit integer as a double.
enum AVCodecID ff_codec_guid_get_id(const AVCodecGuid *guids, ff_asf_guid guid)
static const uint8_t timeline_le16[]
enum AVCodecID ff_wav_codec_get_id(unsigned int tag, int bps)
int disposition
AV_DISPOSITION_* bit field.
static const ff_asf_guid mediasubtype_dtvccdata
static void oledate_to_iso8601(char *buf, int buf_size, int64_t value)
Convert OLE DATE to ISO-8601 string.
int64_t last_valid_pts
pts for next data chunk
uint32_t * sectors
sector shift bits; used to convert sector number into pb_filesystem offset
static AVIOContext * wtvfile_open_sector(int first_sector, uint64_t length, int depth, AVFormatContext *s)
Open file.
int eof_reached
true if eof reached
#define wtvfile_open(s, buf, buf_size, filename)
int channels
number of audio channels
static AVStream * parse_media_type(AVFormatContext *s, AVStream *st, int sid, ff_asf_guid mediatype, ff_asf_guid subtype, ff_asf_guid formattype, int size)
parse Media Type structure and populate stream
int ff_get_bmp_header(AVIOContext *pb, AVStream *st)
Read BITMAPINFOHEADER structure and set AVStream codec width, height and bits_per_encoded_sample fiel...
static int read_ints(AVIOContext *pb, uint32_t *data, int count)
read non-zero integers (le32) from input stream
int nb_sectors
file allocation table
#define AV_CH_LAYOUT_MONO
static int read_seek(AVFormatContext *s, int stream_index, int64_t ts, int flags)
static av_always_inline int ff_guidcmp(const void *g1, const void *g2)
This structure stores compressed data.
static const uint8_t table_0_entries_legacy_attrib_le16[]
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...
static int read_header(AVFormatContext *s)
#define AV_NOPTS_VALUE
Undefined timestamp value.
AVIndexEntry * index_entries
latest valid pts, used for interative seeking
void * av_mallocz(size_t size) av_malloc_attrib 1(1)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...