📄 asffile.h
字号:
/********************************************************************************************
Copyright (C), 2007, Fuzhou Rockchip Co.,Ltd.
File:
AsfFile.h
Description:
Asf File demmux.
Note:
None.
Author:
ljn
$Log: AsfFile.h,v $
Revision 1.5 2008/06/24 02:02:52 HZF
ASF代码优化
Revision 1.4 2008/06/19 04:42:31 Administrator
代码整理!
Revision 1.3 2008/06/02 12:52:37 HZF
对数据有错误的asf文件处理
Revision 1.2 2008/05/30 09:46:57 HZF
wmv死机
Revision 1.1 2008/05/20 12:01:41 HZF
asf文件播放提交
********************************************************************************************/
#ifndef ASFFILE_H
#define ASFFILE_H
#ifdef _IN_ASFFILE_H
#undef EXT
#define EXT
#else
#define EXT extern
#endif
#define ON_RKFS
#ifdef ON_RKFS
#define AsfFopen FS_fopen
#define AsfFClose FS_fclose
#define AsfFILE FS_FILE
#define AsfFseek FS_fseek
#define AsfFread FS_fread
#define AsfFtell FS_ftell
#define AsfFastFseek FSFileSeekEx
#else
#define AsfFread fread
#define AsfFseek fseek
#define AsfFopen fopen
#define AsfFtell ftell
#define AsfFILE FILE
#endif
//#define DEBUG_ASF_ON
typedef signed char gint8;
typedef unsigned char guint8;
typedef signed short gint16;
typedef unsigned short guint16;
typedef signed int gint32;
typedef unsigned int guint32;
#ifndef _MSC_VER
typedef signed long long gint64;
typedef unsigned long long guint64;
#else /* _MSC_VER */
typedef signed __int64 gint64;
typedef unsigned __int64 guint64;
#endif /* _MSC_VER */
typedef char gchar;
typedef short gshort;
typedef long glong;
typedef int gint;
typedef int gboolean;
typedef unsigned char guchar;
typedef unsigned short gushort;
typedef unsigned long int gulong;
typedef unsigned int guint;
typedef float gfloat;
typedef double gdouble;
typedef void* gpointer;
#ifndef mmioFOURCC
#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
( (long)(unsigned char)(ch0) | ( (long)(unsigned char)(ch1) << 8 ) | \
( (long)(unsigned char)(ch2) << 16 ) | ( (long)(unsigned char)(ch3) << 24 ) )
#endif
/* support codecs */
#define fccWMV3 mmioFOURCC('W', 'M', 'V', '3')
#define fccWMV2 mmioFOURCC('W', 'M', 'V', '2')
#define fccWMV1 mmioFOURCC('W', 'M', 'V', '1')
#define WAVE_FORAMT_WMA 0x0161 //WMA
#ifdef DEBUG_ASF_ON
#include <stdio.h>
//#define ASF_DEBUG(format, []) fprintf(stderr, "%s:%4d:", __FUNCTION__, __LINE__), fprintf(stderr, format);
//#define ASF_DEBUG(format, a, b) fprintf(stderr, format);
#define ASF_DEBUG printf
#define ASF_DEBUG_PRINT_GUID(guid) fprintf(stderr, "%08lx-%04lx-%04lx-%02lx-%02lx-%02lx-%02lx-%02lx-%02lx-%02lx-%02lx\n", (guid).m_v1, (guid).m_v2, (guid).m_v3, (guid).m_v4[0],(guid).m_v4[1], (guid).m_v4[2], (guid).m_v4[3], (guid).m_v4[4], (guid).m_v4[5], (guid).m_v4[6], (guid).m_v4[7]);
#else
//#define ASF_DEBUG(format, ...)
#define ASF_DEBUG(...)
#define ASF_DEBUG_PRINT_GUID(guid)
#endif
/** @name Errors */
#define ASF_STREAM_OK 0
#define ASF_FRAME_HEADER_SIZE 12
#define ASF_MAX_EXTRA_DATA_SIZE 64
/**
* GUID structure
*/
typedef struct _ASF_GUID
{
guint32 m_v1;
guint16 m_v2;
guint16 m_v3;
guint8 m_v4[8];
} ASF_GUID;
typedef struct _ASF_PCMData
{
//guint32 m_valid_entries;
guint32 m_sample_rate;
guint8 m_channels;
guint8 m_bps;
guint16 m_encoding;
guint32 m_bytes_per_sec;
guint16 m_align;
guint8 m_dummy[16];
guint16 m_extra_len;
guint8 m_extra_data[ASF_MAX_EXTRA_DATA_SIZE];
} ASF_PCMData;
typedef struct _ASF_VideoData
{
//guint32 m_valid_entries;
guint32 m_encoding;
gfloat m_frame_rate;
guint32 m_width;
guint32 m_height;
guint16 m_planes;
guint16 m_bit_count;
guint32 m_image_size;
guint32 m_xpels_meter;
guint32 m_ypels_meter;
guint32 m_display_width;
guint32 m_display_height;
//guchar m_dummy[4];
guint16 m_extra_len;
guint8 m_extra_data[ASF_MAX_EXTRA_DATA_SIZE];
} ASF_VideoData;
#define ASF_STATE_PLAYING 0
#define ASF_STATE_FFD 1
#define ASF_STATE_FFW 2
#define ASF_STATE_PAUSE 3
#define ASF_STATE_STOP 4
#define ASF_STATE_INITIALIZING 5
#define ASF_STATE_FFW_TEMP 6
#define ASF_FILE_PARSING_OK 0
#define ASF_FILE_FORMAT_ERR -1
#define ASF_FILE_INDX_ERR -2
#define ASF_FILE_NO_MOVI_CHUNK -3
#define ASF_FILE_RESOLUTION_ERR -4
#define ASF_FILE_VIDEO_CODEC_ERR -5
#define ASF_FILE_AUDIO_CODEC_ERR -6
#define ASF_FILE_OPEN_ERR -7
#define ASF_SEEK_POSITION_NUM 256
#define SIZEOF_INDEX_ENTRY 6
#define ASF_ECC_FLAG_TIMEOUT 0x1000 // 0x1000
#define ASF_MAX_WIDTH 720
#define ASF_MAX_RESOLUTION (720*576)
#define UNPACK_ID(id) (guint8)(id & 0xff), (guint8)((id >> 8) & 0xff), (guint8)((id >> 16) & 0xff), (guint8)((id >> 24) & 0xff)
typedef struct
{
guint32 m_guid[4];
guint32 m_length[2];
} ASF_Object;
typedef struct
{
const ASF_GUID *m_guid;
guint32 m_id;
const gchar *m_name;
} ASF_GUID_EX;
struct _ASF_Packet
{
guint8 flags;
guint8 segment_id;
guint32 packet_size;
guint32 pad_size;
guint8 num_segments;
guint8 seglentype;
guint32 send_time;
guint16 duration;
};
struct _ASF_Segment
{
guint8 m_stream_no;
guint8 m_object_id;
guint8 compressed;
guint8 time_delta;
guint32 data_length;
guint32 object_length;
guint32 object_start;
//gpointer m_data;
guint32 m_length;
guint32 m_offset;
};
typedef struct _ASF_Segment ASF_Segment;
typedef struct _ASF_Stream ASF_Stream;
typedef struct _ASF_Packet ASF_Packet;
typedef struct tag_SeekPos
{
guint32 Clus; //当前簇号
guint32 Offset; //文件指针偏移量
guint32 Time;
} SeekPos;
typedef struct tag_ASF_Index_Entry
{
guint32 m_pkt_num;
guint16 m_pkt_count;
} ASF_Index_Entry;
typedef struct tag_ASF_Index
{
guint32 m_time_interval;
guint32 m_max_pkt_count;
guint32 m_entries_count;
ASF_Index_Entry *m_entry;
} ASF_Index;
/* Asf Demux struct */
typedef struct
{
AsfFILE *m_input;
guint64 m_num_packets;
guint64 m_file_size;
guint64 m_end_position_time;
guint32 m_start_position_time;
guint64 m_time_len;
guint32 m_asf_flags;
guint32 m_min_packet_size;
guint32 m_max_packet_size;
guint32 m_uncompressed_len;
guint32 m_width;
guint32 m_height;
guint64 m_data_len;
ASF_Stream *m_audio_stream;
ASF_Stream *m_video_stream;
ASF_Packet m_seek_packet;
ASF_Packet m_bits_packet;
ASF_Packet *m_video_packet;
ASF_Segment m_seek_seg;
ASF_Segment m_bits_seg;
ASF_Segment *m_video_seg;
guint32 m_bits_hdr_flag;
guint32 m_object_id_bak;
guint32 m_time_stamp_bak;
guint32 m_frmhdr_flag;
/* used during seek */
guint32 m_seek_flag;
SeekPos m_seek_dest;
SeekPos m_seek_pos[ASF_SEEK_POSITION_NUM];
/* frm skip ctrl */
guint32 m_next_seek_point;
guint32 m_last_seek_point;
guint32 m_ffd_flag;
guint32 m_ffd_interval;
ASF_Index m_index;
guint32 m_index_flag;
//jmp_buf m_jmp_on_error;
guint32 m_error;
guint32 m_read_bytes;
//SeekPos keyFrm[8000];
} ASF_DEMUX;
struct _ASF_Stream
{
ASF_DEMUX *m_asf;
guint32 m_type;
guint16 m_stream_id;
guint32 m_preload_frames;
guint32 m_type_len;
union
{
ASF_PCMData m_audio;
ASF_VideoData m_video;
} m_type_specific;
char m_temp_str[5];
guint32 m_segs_len;
guint32 m_begin_segment;
guint32 m_begin_sequence;
guint32 m_last_seq_id;
guint32 m_frames_ready;
gboolean m_need_descramble;
guint16 m_audio_w, m_audio_h;
guint16 m_audio_b;
//struct _ASF_Segment *m_segment_to_free;
};
EXT ASF_DEMUX asf;
EXT unsigned int asfPlayState;
EXT int AsfFileParsing(ASF_DEMUX *asf);
EXT int AsfVideoGetDataToSDRAM(ASF_DEMUX *asf, char *buffer, gulong *size);
EXT int AsfFileOpen(ASF_DEMUX *asf, char *path);
EXT void AsfFileClose(ASF_DEMUX *asf);
EXT int AsfSynAudio2Video(ASF_DEMUX *asf);
EXT int AsfSeek(ASF_DEMUX *asf, unsigned int time);
EXT void AsfSeekImmediately(ASF_DEMUX *asf);
EXT int AsfSeekAudioPkt(ASF_DEMUX *asf, int *time);
EXT int AsfSeekNextKeyFrm(ASF_DEMUX *asf);
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -