You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

395 lines
10 KiB

/*****************************************************************************
* libasf.h :
*****************************************************************************
* Copyright © 2001-2004, 2011 VLC authors and VideoLAN
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 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
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/
#ifndef VLC_ASF_LIBASF_H_
#define VLC_ASF_LIBASF_H_
#define ASF_MAX_STREAMNUMBER 127
#define ASF_OBJECT_COMMON_SIZE 24
/*****************************************************************************
* Structure needed for decoder
*****************************************************************************/
#include "libasf_guid.h"
#define ASF_OBJECT_COMMON \
int i_type; \
guid_t i_object_id; \
uint64_t i_object_size; \
uint64_t i_object_pos; \
union asf_object_u *p_father; \
union asf_object_u *p_first; \
union asf_object_u *p_last; \
union asf_object_u *p_next;
typedef struct
{
ASF_OBJECT_COMMON
} asf_object_common_t;
typedef struct
{
uint32_t i_packet_number;
uint16_t i_packet_count;
} asf_index_entry_t;
/****************************************************************************
* High level asf object
****************************************************************************/
/* This is the first header found in an asf file
* It's the only object that has subobjects */
typedef struct
{
ASF_OBJECT_COMMON
uint32_t i_sub_object_count;
uint8_t i_reserved1; /* 0x01, but could be safely ignored */
uint8_t i_reserved2; /* 0x02, if not must failed to source the contain */
} asf_object_header_t;
typedef struct
{
ASF_OBJECT_COMMON
guid_t i_file_id;
uint64_t i_total_data_packets;
uint16_t i_reserved;
} asf_object_data_t;
typedef struct
{
ASF_OBJECT_COMMON
guid_t i_file_id;
uint64_t i_index_entry_time_interval;
uint32_t i_max_packet_count;
uint32_t i_index_entry_count;
asf_index_entry_t *index_entry;
} asf_object_index_t;
/****************************************************************************
* Sub level asf object
****************************************************************************/
#define ASF_FILE_PROPERTIES_BROADCAST 0x01
#define ASF_FILE_PROPERTIES_SEEKABLE 0x02
typedef struct
{
ASF_OBJECT_COMMON
guid_t i_file_id;
uint64_t i_file_size;
uint64_t i_creation_date;
uint64_t i_data_packets_count;
uint64_t i_play_duration;
uint64_t i_send_duration;
uint64_t i_preroll;
uint32_t i_flags;
uint32_t i_min_data_packet_size;
uint32_t i_max_data_packet_size;
uint32_t i_max_bitrate;
} asf_object_file_properties_t;
#define ASF_STREAM_PROPERTIES_ENCRYPTED 0x8000
typedef struct
{
ASF_OBJECT_COMMON
guid_t i_stream_type;
guid_t i_error_correction_type;
uint64_t i_time_offset;
uint32_t i_type_specific_data_length;
uint32_t i_error_correction_data_length;
uint16_t i_flags;
/* extrated from flags */
uint8_t i_stream_number;
uint32_t i_reserved;
uint8_t *p_type_specific_data;
uint8_t *p_error_correction_data;
} asf_object_stream_properties_t;
typedef struct
{
ASF_OBJECT_COMMON
guid_t i_reserved1;
uint16_t i_reserved2;
uint32_t i_header_extension_size;
uint8_t *p_header_extension_data;
} asf_object_header_extension_t;
enum {
ASF_METADATA_TYPE_STRING,
ASF_METADATA_TYPE_BYTE,
ASF_METADATA_TYPE_BOOL,
ASF_METADATA_TYPE_DWORD,
ASF_METADATA_TYPE_QWORD,
ASF_METADATA_TYPE_WORD,
};
typedef struct
{
uint16_t i_stream;
uint16_t i_type;
char *psz_name;
uint64_t i_val;
uint16_t i_data;
uint8_t *p_data;
} asf_metadata_record_t;
typedef struct
{
ASF_OBJECT_COMMON
uint32_t i_record_entries_count;
asf_metadata_record_t *record;
} asf_object_metadata_t;
typedef struct
{
ASF_OBJECT_COMMON
char *psz_title;
char *psz_artist;
char *psz_copyright;
char *psz_description;
char *psz_rating;
} asf_object_content_description_t;
#define ASF_CODEC_TYPE_VIDEO 0x0001
#define ASF_CODEC_TYPE_AUDIO 0x0002
#define ASF_CODEC_TYPE_UNKNOWN 0xffff
typedef struct asf_codec_entry
{
uint16_t i_type;
char *psz_name;
char *psz_description;
uint16_t i_information_length;
uint8_t *p_information;
struct asf_codec_entry *p_next;
} asf_codec_entry_t;
typedef struct
{
ASF_OBJECT_COMMON
guid_t i_reserved;
asf_codec_entry_t *codecs;
} asf_object_codec_list_t;
typedef struct
{
uint64_t i_offset;
uint64_t i_presentation_time;
uint16_t i_entry_length;
uint32_t i_send_time;
uint32_t i_flags;
uint32_t i_marker_description_length;
char *p_marker_description;
} asf_marker_t;
typedef struct
{
ASF_OBJECT_COMMON
guid_t i_reserved1;
uint32_t i_count;
uint16_t i_reserved2;
char *name;
asf_marker_t *marker;
} asf_object_marker_t;
typedef struct
{
ASF_OBJECT_COMMON
uint16_t i_language;
char **ppsz_language;
} asf_object_language_list_t;
typedef struct
{
ASF_OBJECT_COMMON
uint16_t i_bitrate;
struct
{
uint8_t i_stream_number;
uint32_t i_avg_bitrate;
} bitrate[ASF_MAX_STREAMNUMBER + 1];
} asf_object_stream_bitrate_properties_t;
typedef struct
{
guid_t i_extension_id;
uint16_t i_data_size;
uint32_t i_info_length;
char *pi_info;
} asf_payload_extension_system_t;
#define ASF_EXTENSION_VIDEOFRAME_NEWFRAME 0x08
#define ASF_EXTENSION_VIDEOFRAME_IFRAME 0x01
#define ASF_EXTENSION_VIDEOFRAME_TYPE_MASK 0x07
typedef struct
{
ASF_OBJECT_COMMON
uint64_t i_start_time;
uint64_t i_end_time;
uint32_t i_data_bitrate;
uint32_t i_buffer_size;
uint32_t i_initial_buffer_fullness;
uint32_t i_alternate_data_bitrate;
uint32_t i_alternate_buffer_size;
uint32_t i_alternate_initial_buffer_fullness;
uint32_t i_maximum_object_size;
uint32_t i_flags;
uint16_t i_stream_number;
uint16_t i_language_index;
uint64_t i_average_time_per_frame;
uint16_t i_stream_name_count;
uint16_t i_payload_extension_system_count;
asf_payload_extension_system_t *p_ext;
uint16_t *pi_stream_name_language;
char **ppsz_stream_name;
asf_object_stream_properties_t *p_sp;
} asf_object_extended_stream_properties_t;
#define ASF_MAX_EXCLUSION_TYPE 2
typedef enum
{
LANGUAGE = ASF_MAX_EXCLUSION_TYPE,
BITRATE = 1,
UNKNOWN = 0
} asf_exclusion_type_t;
typedef struct
{
ASF_OBJECT_COMMON
asf_exclusion_type_t exclusion_type;
uint16_t i_stream_number_count;
uint16_t *pi_stream_number;
} asf_object_advanced_mutual_exclusion_t;
typedef struct
{
ASF_OBJECT_COMMON
uint16_t i_priority_count;
uint16_t *pi_priority_flag;
uint16_t *pi_priority_stream_number;
} asf_object_stream_prioritization_t;
typedef struct
{
ASF_OBJECT_COMMON
asf_exclusion_type_t exclusion_type;
uint16_t i_stream_number_count;
uint16_t *pi_stream_numbers;
} asf_object_bitrate_mutual_exclusion_t;
typedef struct
{
ASF_OBJECT_COMMON
uint16_t i_count;
char **ppsz_name;
char **ppsz_value;
} asf_object_extended_content_description_t;
/****************************************************************************
* Special Root Object
****************************************************************************/
typedef struct
{
ASF_OBJECT_COMMON
asf_object_header_t *p_hdr;
asf_object_data_t *p_data;
/* could be NULL if !b_seekable or not-present */
asf_object_index_t *p_index;
/* from asf_object_header_t */
asf_object_file_properties_t *p_fp;
/* from asf_object_header_extension_t */
asf_object_metadata_t *p_metadata;
} asf_object_root_t;
/****************************************************************************
* asf_object_t: union of all objects.
****************************************************************************/
typedef union asf_object_u
{
asf_object_common_t common;
asf_object_header_t header;
asf_object_data_t data;
asf_object_index_t index;
asf_object_root_t root;
asf_object_file_properties_t file_properties;
asf_object_stream_properties_t stream_properties;
asf_object_header_extension_t header_extension;
asf_object_metadata_t metadata;
asf_object_codec_list_t codec_list;
asf_object_marker_t marker;
asf_object_language_list_t language_list;
asf_object_stream_bitrate_properties_t stream_bitrate;
asf_object_extended_stream_properties_t ext_stream;
asf_object_content_description_t content_description;
asf_object_advanced_mutual_exclusion_t advanced_mutual_exclusion;
asf_object_stream_prioritization_t stream_prioritization;
asf_object_bitrate_mutual_exclusion_t bitrate_mutual_exclusion;
asf_object_extended_content_description_t extended_content_description;
} asf_object_t;
asf_object_root_t *ASF_ReadObjectRoot( stream_t *, int b_seekable );
void ASF_FreeObjectRoot( stream_t *, asf_object_root_t *p_root );
int ASF_CountObject ( void *p_obj, const guid_t *p_guid );
void *ASF_FindObject( void *p_obj, const guid_t *p_guid, int i_number );
#endif