91av视频/亚洲h视频/操亚洲美女/外国一级黄色毛片 - 国产三级三级三级三级

資源簡介

ffmpeg/ffplay是當(dāng)今多媒體領(lǐng)域的王者,很多很多的人想研究學(xué)習(xí)ffmpeg/ffplay,但苦于ffmpeg/ffplay龐大的代碼量,令人望而生畏。為幫助更多的人研習(xí)ffmpeg/ffplay,在保持ffmpeg/ffplay體系架構(gòu)的完整性的前提下,把ffmpeg/ffplay大規(guī)模的瘦身后,研習(xí)門檻一下子降低了n多個數(shù)量級。附件一個是對瘦身后的ffmpeg/ffplay的代碼完整的剖析pdf文檔,另一個是瘦身后的ffmpeg/ffplay的完整源代碼,最大化幫助各位網(wǎng)友研究學(xué)習(xí)ffmpeg/ffplay。

資源截圖

代碼片段和文件信息


#include?“./libavformat/avformat.h“

#if?defined(CONFIG_WIN32)
#include?
#include?
#include?
#else
#include?
#include?
#endif

#include?

#include?
#include?
#include?

#ifdef?CONFIG_WIN32
#undef?main?//?We?don‘t?want?SDL?to?override?our?main()
#endif

#pragma?comment(lib?“SDL.lib“)

#define?FF_QUIT_EVENT???(SDL_USEREVENT?+?2)

#define?MAX_VIDEOQ_SIZE?(5?*?256?*?1024)
#define?MAX_AUDIOQ_SIZE?(5?*?16?*?1024)

#define?VIDEO_PICTURE_QUEUE_SIZE?1

typedef?struct?PacketQueue
{
????AVPacketList?*first_pkt??*last_pkt;
????int?size;
????int?abort_request;
????SDL_mutex?*mutex;
????SDL_cond?*cond;
}?PacketQueue;

typedef?struct?VideoPicture
{
????SDL_Overlay?*bmp;
????int?width?height;?//?source?height?&?width
}?VideoPicture;

typedef?struct?VideoState
{
????SDL_Thread?*parse_tid;
????SDL_Thread?*video_tid;

????int?abort_request;

????AVFormatContext?*ic;

????int?audio_stream;?
????int?video_stream;

????AVStream?*audio_st;
????AVStream?*video_st;

????PacketQueue?audioq;
????PacketQueue?videoq;

????VideoPicture?pictq[VIDEO_PICTURE_QUEUE_SIZE];
????double?frame_last_delay;

????uint8_t?audio_buf[(AVCODEC_MAX_AUDIO_frame_SIZE?*3)?/?2];
????unsigned?int?audio_buf_size;
????int?audio_buf_index;
????AVPacket?audio_pkt;
????uint8_t?*audio_pkt_data;
????int?audio_pkt_size;

????SDL_mutex?*video_decoder_mutex;
????SDL_mutex?*audio_decoder_mutex;

????char?filename[240];

}?VideoState;

static?AVInputFormat?*file_iformat;
static?const?char?*input_filename;
static?VideoState?*cur_stream;

static?SDL_Surface?*screen;

int64_t?av_gettime(void)
{
#if?defined(CONFIG_WINCE)
????return?timeGetTime()?*int64_t_C(1000);
#elif?defined(CONFIG_WIN32)
????struct?_timeb?tb;
????_ftime(&tb);
????return?((int64_t)tb.time?*int64_t_C(1000)?+?(int64_t)tb.millitm)?*int64_t_C(1000);
#else
????struct?timeval?tv;
????gettimeofday(&tv?NULL);
????return?(int64_t)tv.tv_sec?*1000000+tv.tv_usec;
#endif
}

static?void?packet_queue_init(PacketQueue?*q)?//?packet?queue?handling
{
????memset(q?0?sizeof(PacketQueue));
????q->mutex?=?SDL_CreateMutex();
????q->cond?=?SDL_CreateCond();
}

static?void?packet_queue_flush(PacketQueue?*q)
{
????AVPacketList?*pkt??*pkt1;

????SDL_LockMutex(q->mutex);
????for?(pkt?=?q->first_pkt;?pkt?!=?NULL;?pkt?=?pkt1)
????{
????????pkt1?=?pkt->next;
????????av_free_packet(&pkt->pkt);
????????av_freep(&pkt);
????}
????q->last_pkt?=?NULL;
????q->first_pkt?=?NULL;
????q->size?=?0;
????SDL_UnlockMutex(q->mutex);
}

static?void?packet_queue_end(PacketQueue?*q)
{
????packet_queue_flush(q);
????SDL_DestroyMutex(q->mutex);
????SDL_DestroyCond(q->cond);
}

static?int?packet_queue_put(PacketQueue?*q?AVPacket?*pkt)
{
????AVPacketList?*pkt1;

????pkt1?=?av_malloc(sizeof(AVPacketList));
????if?(!pkt1)
????????return??-?1;
????pkt1->pkt?=??

評論

共有 條評論