⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 asffile.h

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 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 + -