рд╣рдо рд╢реЗрд╖ рдЕрдиреБрд╡рд╛рдж рдХреЛ рдореИрдиреБрдЕрд▓ рдХреЗ рд░реВрд╕реА рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдХреБрдЫ рд╣рдж рддрдХ рдкреБрд░рд╛рдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдирд╣реАрдВ рдЦреЛрдИ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ FFmpeg рдФрд░ SDL рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реАрдбрд┐рдпреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ "рд░рд╕реЛрдИ" рдХреЛ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИредрдФрд░ рдпрджреНрдпрдкрд┐ рд╣рдордиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЪрдордХрджрд╛рд░ рдкрд╛рда рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреА рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИрдВ ред рдмрдЧреНрд╕ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ (рдЕрдзрд┐рдорд╛рдирддрдГ рдирд┐рдЬреА рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ) - рдПрдХ рд╕рд╛рде рд╣рдо рдмреЗрд╣рддрд░ рдХрд░реЗрдВрдЧреЗредрд╡рд┐рд╖рдп - рд╕реВрдЪреА

EDISON.
, .
, , Axxon Next SureView Immix.
! ;-)
tutorial06.c
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <SDL.h>
#include <SDL_thread.h>
#ifdef __MINGW32__
#undef main
#endif
#include <stdio.h>
#include <assert.h>
#include <math.h>
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
#define av_frame_alloc avcodec_alloc_frame
#define av_frame_free avcodec_free_frame
#endif
#define SDL_AUDIO_BUFFER_SIZE 1024
#define MAX_AUDIO_FRAME_SIZE 192000
#define MAX_AUDIOQ_SIZE (5 * 16 * 1024)
#define MAX_VIDEOQ_SIZE (5 * 256 * 1024)
#define AV_SYNC_THRESHOLD 0.01
#define AV_NOSYNC_THRESHOLD 10.0
#define SAMPLE_CORRECTION_PERCENT_MAX 10
#define AUDIO_DIFF_AVG_NB 20
#define FF_REFRESH_EVENT (SDL_USEREVENT)
#define FF_QUIT_EVENT (SDL_USEREVENT + 1)
#define VIDEO_PICTURE_QUEUE_SIZE 1
#define DEFAULT_AV_SYNC_TYPE AV_SYNC_VIDEO_MASTER
typedef struct PacketQueue {
AVPacketList *first_pkt, *last_pkt;
int nb_packets;
int size;
SDL_mutex *mutex;
SDL_cond *cond;
} PacketQueue;
typedef struct VideoPicture {
SDL_Overlay *bmp;
int width, height;
int allocated;
double pts;
} VideoPicture;
typedef struct VideoState {
AVFormatContext *pFormatCtx;
int videoStream, audioStream;
int av_sync_type;
double external_clock;
int64_t external_clock_time;
double audio_clock;
AVStream *audio_st;
AVCodecContext *audio_ctx;
PacketQueue audioq;
uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];
unsigned int audio_buf_size;
unsigned int audio_buf_index;
AVFrame audio_frame;
AVPacket audio_pkt;
uint8_t *audio_pkt_data;
int audio_pkt_size;
int audio_hw_buf_size;
double audio_diff_cum;
double audio_diff_avg_coef;
double audio_diff_threshold;
int audio_diff_avg_count;
double frame_timer;
double frame_last_pts;
double frame_last_delay;
double video_clock;
double video_current_pts;
int64_t video_current_pts_time;
AVStream *video_st;
AVCodecContext *video_ctx;
PacketQueue videoq;
struct SwsContext *sws_ctx;
VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE];
int pictq_size, pictq_rindex, pictq_windex;
SDL_mutex *pictq_mutex;
SDL_cond *pictq_cond;
SDL_Thread *parse_tid;
SDL_Thread *video_tid;
char filename[1024];
int quit;
} VideoState;
enum {
AV_SYNC_AUDIO_MASTER,
AV_SYNC_VIDEO_MASTER,
AV_SYNC_EXTERNAL_MASTER,
};
SDL_Surface *screen;
SDL_mutex *screen_mutex;
VideoState *global_video_state;
void packet_queue_init(PacketQueue *q) {
memset(q, 0, sizeof(PacketQueue));
q->mutex = SDL_CreateMutex();
q->cond = SDL_CreateCond();
}
int packet_queue_put(PacketQueue *q, AVPacket *pkt) {
AVPacketList *pkt1;
if(av_dup_packet(pkt) < 0) {
return -1;
}
pkt1 = av_malloc(sizeof(AVPacketList));
if (!pkt1)
return -1;
pkt1->pkt = *pkt;
pkt1->next = NULL;
SDL_LockMutex(q->mutex);
if (!q->last_pkt)
q->first_pkt = pkt1;
else
q->last_pkt->next = pkt1;
q->last_pkt = pkt1;
q->nb_packets++;
q->size += pkt1->pkt.size;
SDL_CondSignal(q->cond);
SDL_UnlockMutex(q->mutex);
return 0;
}
static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
{
AVPacketList *pkt1;
int ret;
SDL_LockMutex(q->mutex);
for(;;) {
if(global_video_state->quit) {
ret = -1;
break;
}
pkt1 = q->first_pkt;
if (pkt1) {
q->first_pkt = pkt1->next;
if (!q->first_pkt)
q->last_pkt = NULL;
q->nb_packets--;
q->size -= pkt1->pkt.size;
*pkt = pkt1->pkt;
av_free(pkt1);
ret = 1;
break;
} else if (!block) {
ret = 0;
break;
} else {
SDL_CondWait(q->cond, q->mutex);
}
}
SDL_UnlockMutex(q->mutex);
return ret;
}
double get_audio_clock(VideoState *is) {
double pts;
int hw_buf_size, bytes_per_sec, n;
pts = is->audio_clock;
hw_buf_size = is->audio_buf_size - is->audio_buf_index;
bytes_per_sec = 0;
n = is->audio_ctx->channels * 2;
if(is->audio_st) {
bytes_per_sec = is->audio_ctx->sample_rate * n;
}
if(bytes_per_sec) {
pts -= (double)hw_buf_size / bytes_per_sec;
}
return pts;
}
double get_video_clock(VideoState *is) {
double delta;
delta = (av_gettime() - is->video_current_pts_time) / 1000000.0;
return is->video_current_pts + delta;
}
double get_external_clock(VideoState *is) {
return av_gettime() / 1000000.0;
}
double get_master_clock(VideoState *is) {
if(is->av_sync_type == AV_SYNC_VIDEO_MASTER) {
return get_video_clock(is);
} else if(is->av_sync_type == AV_SYNC_AUDIO_MASTER) {
return get_audio_clock(is);
} else {
return get_external_clock(is);
}
}
int synchronize_audio(VideoState *is, short *samples,
int samples_size, double pts) {
int n;
double ref_clock;
n = 2 * is->audio_ctx->channels;
if(is->av_sync_type != AV_SYNC_AUDIO_MASTER) {
double diff, avg_diff;
int wanted_size, min_size, max_size ;
ref_clock = get_master_clock(is);
diff = get_audio_clock(is) - ref_clock;
if(diff < AV_NOSYNC_THRESHOLD) {
is->audio_diff_cum = diff + is->audio_diff_avg_coef
* is->audio_diff_cum;
if(is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {
is->audio_diff_avg_count++;
} else {
avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);
if(fabs(avg_diff) >= is->audio_diff_threshold) {
wanted_size = samples_size + ((int)(diff * is->audio_ctx->sample_rate) * n);
min_size = samples_size * ((100 - SAMPLE_CORRECTION_PERCENT_MAX) / 100);
max_size = samples_size * ((100 + SAMPLE_CORRECTION_PERCENT_MAX) / 100);
if(wanted_size < min_size) {
wanted_size = min_size;
} else if (wanted_size > max_size) {
wanted_size = max_size;
}
if(wanted_size < samples_size) {
samples_size = wanted_size;
} else if(wanted_size > samples_size) {
uint8_t *samples_end, *q;
int nb;
nb = (samples_size - wanted_size);
samples_end = (uint8_t *)samples + samples_size - n;
q = samples_end + n;
while(nb > 0) {
memcpy(q, samples_end, n);
q += n;
nb -= n;
}
samples_size = wanted_size;
}
}
}
} else {
is->audio_diff_avg_count = 0;
is->audio_diff_cum = 0;
}
}
return samples_size;
}
int audio_decode_frame(VideoState *is, uint8_t *audio_buf, int buf_size, double *pts_ptr) {
int len1, data_size = 0;
AVPacket *pkt = &is->audio_pkt;
double pts;
int n;
for(;;) {
while(is->audio_pkt_size > 0) {
int got_frame = 0;
len1 = avcodec_decode_audio4(is->audio_ctx, &is->audio_frame, &got_frame, pkt);
if(len1 < 0) {
is->audio_pkt_size = 0;
break;
}
data_size = 0;
if(got_frame) {
data_size = av_samples_get_buffer_size(NULL,
is->audio_ctx->channels,
is->audio_frame.nb_samples,
is->audio_ctx->sample_fmt,
1);
assert(data_size <= buf_size);
memcpy(audio_buf, is->audio_frame.data[0], data_size);
}
is->audio_pkt_data += len1;
is->audio_pkt_size -= len1;
if(data_size <= 0) {
continue;
}
pts = is->audio_clock;
*pts_ptr = pts;
n = 2 * is->audio_ctx->channels;
is->audio_clock += (double)data_size /
(double)(n * is->audio_ctx->sample_rate);
return data_size;
}
if(pkt->data)
av_free_packet(pkt);
if(is->quit) {
return -1;
}
if(packet_queue_get(&is->audioq, pkt, 1) < 0) {
return -1;
}
is->audio_pkt_data = pkt->data;
is->audio_pkt_size = pkt->size;
if(pkt->pts != AV_NOPTS_VALUE) {
is->audio_clock = av_q2d(is->audio_st->time_base)*pkt->pts;
}
}
}
void audio_callback(void *userdata, Uint8 *stream, int len) {
VideoState *is = (VideoState *)userdata;
int len1, audio_size;
double pts;
while(len > 0) {
if(is->audio_buf_index >= is->audio_buf_size) {
audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts);
if(audio_size < 0) {
is->audio_buf_size = 1024;
memset(is->audio_buf, 0, is->audio_buf_size);
} else {
audio_size = synchronize_audio(is, (int16_t *)is->audio_buf,
audio_size, pts);
is->audio_buf_size = audio_size;
}
is->audio_buf_index = 0;
}
len1 = is->audio_buf_size - is->audio_buf_index;
if(len1 > len)
len1 = len;
memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
len -= len1;
stream += len1;
is->audio_buf_index += len1;
}
}
static Uint32 sdl_refresh_timer_cb(Uint32 interval, void *opaque) {
SDL_Event event;
event.type = FF_REFRESH_EVENT;
event.user.data1 = opaque;
SDL_PushEvent(&event);
return 0;
}
static void schedule_refresh(VideoState *is, int delay) {
SDL_AddTimer(delay, sdl_refresh_timer_cb, is);
}
void video_display(VideoState *is) {
SDL_Rect rect;
VideoPicture *vp;
float aspect_ratio;
int w, h, x, y;
int i;
vp = &is->pictq[is->pictq_rindex];
if(vp->bmp) {
if(is->video_ctx->sample_aspect_ratio.num == 0) {
aspect_ratio = 0;
} else {
aspect_ratio = av_q2d(is->video_ctx->sample_aspect_ratio) *
is->video_ctx->width / is->video_ctx->height;
}
if(aspect_ratio <= 0.0) {
aspect_ratio = (float)is->video_ctx->width /
(float)is->video_ctx->height;
}
h = screen->h;
w = ((int)rint(h * aspect_ratio)) & -3;
if(w > screen->w) {
w = screen->w;
h = ((int)rint(w / aspect_ratio)) & -3;
}
x = (screen->w - w) / 2;
y = (screen->h - h) / 2;
rect.x = x;
rect.y = y;
rect.w = w;
rect.h = h;
SDL_LockMutex(screen_mutex);
SDL_DisplayYUVOverlay(vp->bmp, &rect);
SDL_UnlockMutex(screen_mutex);
}
}
void video_refresh_timer(void *userdata) {
VideoState *is = (VideoState *)userdata;
VideoPicture *vp;
double actual_delay, delay, sync_threshold, ref_clock, diff;
if(is->video_st) {
if(is->pictq_size == 0) {
schedule_refresh(is, 1);
} else {
vp = &is->pictq[is->pictq_rindex];
is->video_current_pts = vp->pts;
is->video_current_pts_time = av_gettime();
delay = vp->pts - is->frame_last_pts;
if(delay <= 0 || delay >= 1.0) {
delay = is->frame_last_delay;
}
is->frame_last_delay = delay;
is->frame_last_pts = vp->pts;
if(is->av_sync_type != AV_SYNC_VIDEO_MASTER) {
ref_clock = get_master_clock(is);
diff = vp->pts - ref_clock;
sync_threshold = (delay > AV_SYNC_THRESHOLD) ? delay : AV_SYNC_THRESHOLD;
if(fabs(diff) < AV_NOSYNC_THRESHOLD) {
if(diff <= -sync_threshold) {
delay = 0;
} else if(diff >= sync_threshold) {
delay = 2 * delay;
}
}
}
is->frame_timer += delay;
actual_delay = is->frame_timer - (av_gettime() / 1000000.0);
if(actual_delay < 0.010) {
actual_delay = 0.010;
}
schedule_refresh(is, (int)(actual_delay * 1000 + 0.5));
video_display(is);
if(++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE) {
is->pictq_rindex = 0;
}
SDL_LockMutex(is->pictq_mutex);
is->pictq_size--;
SDL_CondSignal(is->pictq_cond);
SDL_UnlockMutex(is->pictq_mutex);
}
} else {
schedule_refresh(is, 100);
}
}
void alloc_picture(void *userdata) {
VideoState *is = (VideoState *)userdata;
VideoPicture *vp;
vp = &is->pictq[is->pictq_windex];
if(vp->bmp) {
SDL_FreeYUVOverlay(vp->bmp);
}
SDL_LockMutex(screen_mutex);
vp->bmp = SDL_CreateYUVOverlay(is->video_ctx->width,
is->video_ctx->height,
SDL_YV12_OVERLAY,
screen);
SDL_UnlockMutex(screen_mutex);
vp->width = is->video_ctx->width;
vp->height = is->video_ctx->height;
vp->allocated = 1;
}
int queue_picture(VideoState *is, AVFrame *pFrame, double pts) {
VideoPicture *vp;
int dst_pix_fmt;
AVPicture pict;
SDL_LockMutex(is->pictq_mutex);
while(is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE &&
!is->quit) {
SDL_CondWait(is->pictq_cond, is->pictq_mutex);
}
SDL_UnlockMutex(is->pictq_mutex);
if(is->quit)
return -1;
vp = &is->pictq[is->pictq_windex];
if(!vp->bmp ||
vp->width != is->video_ctx->width ||
vp->height != is->video_ctx->height) {
SDL_Event event;
vp->allocated = 0;
alloc_picture(is);
if(is->quit) {
return -1;
}
}
if(vp->bmp) {
SDL_LockYUVOverlay(vp->bmp);
vp->pts = pts;
dst_pix_fmt = PIX_FMT_YUV420P;
pict.data[0] = vp->bmp->pixels[0];
pict.data[1] = vp->bmp->pixels[2];
pict.data[2] = vp->bmp->pixels[1];
pict.linesize[0] = vp->bmp->pitches[0];
pict.linesize[1] = vp->bmp->pitches[2];
pict.linesize[2] = vp->bmp->pitches[1];
sws_scale(is->sws_ctx, (uint8_t const * const *)pFrame->data,
pFrame->linesize, 0, is->video_ctx->height,
pict.data, pict.linesize);
SDL_UnlockYUVOverlay(vp->bmp);
if(++is->pictq_windex == VIDEO_PICTURE_QUEUE_SIZE) {
is->pictq_windex = 0;
}
SDL_LockMutex(is->pictq_mutex);
is->pictq_size++;
SDL_UnlockMutex(is->pictq_mutex);
}
return 0;
}
double synchronize_video(VideoState *is, AVFrame *src_frame, double pts) {
double frame_delay;
if(pts != 0) {
is->video_clock = pts;
} else {
pts = is->video_clock;
}
frame_delay = av_q2d(is->video_ctx->time_base);
frame_delay += src_frame->repeat_pict * (frame_delay * 0.5);
is->video_clock += frame_delay;
return pts;
}
int video_thread(void *arg) {
VideoState *is = (VideoState *)arg;
AVPacket pkt1, *packet = &pkt1;
int frameFinished;
AVFrame *pFrame;
double pts;
pFrame = av_frame_alloc();
for(;;) {
if(packet_queue_get(&is->videoq, packet, 1) < 0) {
break;
}
if(packet_queue_get(&is->videoq, packet, 1) < 0) {
break;
}
pts = 0;
avcodec_decode_video2(is->video_ctx, pFrame, &frameFinished, packet);
if((pts = av_frame_get_best_effort_timestamp(pFrame)) == AV_NOPTS_VALUE) {
} else {
pts = 0;
}
pts *= av_q2d(is->video_st->time_base);
if(frameFinished) {
pts = synchronize_video(is, pFrame, pts);
if(queue_picture(is, pFrame, pts) < 0) {
break;
}
}
av_free_packet(packet);
}
av_frame_free(&pFrame);
return 0;
}
int stream_component_open(VideoState *is, int stream_index) {
AVFormatContext *pFormatCtx = is->pFormatCtx;
AVCodecContext *codecCtx = NULL;
AVCodec *codec = NULL;
SDL_AudioSpec wanted_spec, spec;
if(stream_index < 0 || stream_index >= pFormatCtx->nb_streams) {
return -1;
}
codec = avcodec_find_decoder(pFormatCtx->streams[stream_index]->codec->codec_id);
if(!codec) {
fprintf(stderr, "Unsupported codec!\n");
return -1;
}
codecCtx = avcodec_alloc_context3(codec);
if(avcodec_copy_context(codecCtx, pFormatCtx->streams[stream_index]->codec) != 0) {
fprintf(stderr, "Couldn't copy codec context");
return -1;
}
if(codecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
wanted_spec.freq = codecCtx->sample_rate;
wanted_spec.format = AUDIO_S16SYS;
wanted_spec.channels = codecCtx->channels;
wanted_spec.silence = 0;
wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
wanted_spec.callback = audio_callback;
wanted_spec.userdata = is;
if(SDL_OpenAudio(&wanted_spec, &spec) < 0) {
fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError());
return -1;
}
is->audio_hw_buf_size = spec.size;
}
if(avcodec_open2(codecCtx, codec, NULL) < 0) {
fprintf(stderr, "Unsupported codec!\n");
return -1;
}
switch(codecCtx->codec_type) {
case AVMEDIA_TYPE_AUDIO:
is->audioStream = stream_index;
is->audio_st = pFormatCtx->streams[stream_index];
is->audio_ctx = codecCtx;
is->audio_buf_size = 0;
is->audio_buf_index = 0;
memset(&is->audio_pkt, 0, sizeof(is->audio_pkt));
packet_queue_init(&is->audioq);
SDL_PauseAudio(0);
break;
case AVMEDIA_TYPE_VIDEO:
is->videoStream = stream_index;
is->video_st = pFormatCtx->streams[stream_index];
is->video_ctx = codecCtx;
is->frame_timer = (double)av_gettime() / 1000000.0;
is->frame_last_delay = 40e-3;
is->video_current_pts_time = av_gettime();
packet_queue_init(&is->videoq);
is->video_tid = SDL_CreateThread(video_thread, is);
is->sws_ctx = sws_getContext(is->video_ctx->width, is->video_ctx->height,
is->video_ctx->pix_fmt, is->video_ctx->width,
is->video_ctx->height, PIX_FMT_YUV420P,
SWS_BILINEAR, NULL, NULL, NULL
);
break;
default:
break;
}
}
int decode_thread(void *arg) {
VideoState *is = (VideoState *)arg;
AVFormatContext *pFormatCtx;
AVPacket pkt1, *packet = &pkt1;
int video_index = -1;
int audio_index = -1;
int i;
is->videoStream=-1;
is->audioStream=-1;
global_video_state = is;
if(avformat_open_input(&pFormatCtx, is->filename, NULL, NULL)!=0)
return -1;
is->pFormatCtx = pFormatCtx;
if(avformat_find_stream_info(pFormatCtx, NULL)<0)
return -1;
av_dump_format(pFormatCtx, 0, is->filename, 0);
for(i=0; i<pFormatCtx->nb_streams; i++) {
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO &&
video_index < 0) {
video_index=i;
}
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO &&
audio_index < 0) {
audio_index=i;
}
}
if(audio_index >= 0) {
stream_component_open(is, audio_index);
}
if(video_index >= 0) {
stream_component_open(is, video_index);
}
if(is->videoStream < 0 || is->audioStream < 0) {
fprintf(stderr, "%s: could not open codecs\n", is->filename);
goto fail;
}
for(;;) {
if(is->quit) {
break;
}
if(is->audioq.size > MAX_AUDIOQ_SIZE ||
is->videoq.size > MAX_VIDEOQ_SIZE) {
SDL_Delay(10);
continue;
}
if(av_read_frame(is->pFormatCtx, packet) < 0) {
if(is->pFormatCtx->pb->error == 0) {
SDL_Delay(100);
continue;
} else {
break;
}
}
if(packet->stream_index == is->videoStream) {
packet_queue_put(&is->videoq, packet);
} else if(packet->stream_index == is->audioStream) {
packet_queue_put(&is->audioq, packet);
} else {
av_free_packet(packet);
}
}
while(!is->quit) {
SDL_Delay(100);
}
fail:
if(1){
SDL_Event event;
event.type = FF_QUIT_EVENT;
event.user.data1 = is;
SDL_PushEvent(&event);
}
return 0;
}
int main(int argc, char *argv[]) {
SDL_Event event;
VideoState *is;
is = av_mallocz(sizeof(VideoState));
if(argc < 2) {
fprintf(stderr, "Usage: test <file>\n");
exit(1);
}
av_register_all();
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
exit(1);
}
#ifndef __DARWIN__
screen = SDL_SetVideoMode(640, 480, 0, 0);
#else
screen = SDL_SetVideoMode(640, 480, 24, 0);
#endif
if(!screen) {
fprintf(stderr, "SDL: could not set video mode - exiting\n");
exit(1);
}
screen_mutex = SDL_CreateMutex();
av_strlcpy(is->filename, argv[1], sizeof(is->filename));
is->pictq_mutex = SDL_CreateMutex();
is->pictq_cond = SDL_CreateCond();
schedule_refresh(is, 40);
is->av_sync_type = DEFAULT_AV_SYNC_TYPE;
is->parse_tid = SDL_CreateThread(decode_thread, is);
if(!is->parse_tid) {
av_free(is);
return -1;
}
for(;;) {
SDL_WaitEvent(&event);
switch(event.type) {
case FF_QUIT_EVENT:
case SDL_QUIT:
is->quit = 1;
SDL_Quit();
return 0;
break;
case FF_REFRESH_EVENT:
video_refresh_timer(event.user.data1);
break;
default:
break;
}
}
return 0;
}
рдЕрдм рдЬрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХрдо рдпрд╛ рдЬреНрдпрд╛рджрд╛ рд╕рднреНрдп рдЦрд┐рд▓рд╛рдбрд╝реА рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЖрдк рдлрд┐рд▓реНрдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЪрд▓рд┐рдП рдЕрдм рдорд┐рд▓рддреЗ рд╣реИрдВред рдкрд┐рдЫрд▓реА рдмрд╛рд░, рд╣рдордиреЗ рдереЛрдбрд╝реА рджреЗрд░ рдореЗрдВ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди, рдЕрд░реНрдерд╛рддреН рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдзреНрд╡рдирд┐ рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛ рдЫреБрдЖ, рдЙрд╕ рдХреНрд░рдо рдореЗрдВ, рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рдирд╣реАрдВред рд╣рдо рдЗрд╕реЗ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рдорд╛рди рд▓реЗрдЖрдЙрдЯ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ: рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдВрддрд░рд┐рдХ рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рдмрдирд╛рдПрдВ рдФрд░ рдСрдбрд┐рдпреЛ рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВред рдмрд╛рдж рдореЗрдВ рд╣рдо рдФрд░ рднреА рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдПрдХ рдмрд╛рд╣рд░реА рдШрдбрд╝реА рдХреЗ рд╕рд╛рде рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рддреЗ рд╣реИрдВредрд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЕрдм рд╣рдо рдЖрдЦрд┐рд░реА рдмрд╛рд░ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдореМрдЬреВрдж рдСрдбрд┐рдпреЛ рдШрдбрд╝реА рдХреЗ рд╕рдорд╛рди рдПрдХ рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ: рдПрдХ рдЖрдВрддрд░рд┐рдХ рдореВрд▓реНрдп рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдЦреЗрд▓ рд░рд╣реЗ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдХреА рднрд░рдкрд╛рдИ рдХрд░рддрд╛ рд╣реИред рдЖрдк рд╕реЛрдЪ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдЕрдВрддрд┐рдо рдлреНрд░реЗрдо рдХреЗ рд╡рд░реНрддрдорд╛рди рдкреАрдЯреАрдПрд╕ рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдорд░ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдЬрд┐рддрдирд╛ рд╕рд░рд▓ рд╣реЛрдЧрд╛ ред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдЕрдЧрд░ рд╣рдо рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╕реНрддрд░ рддрдХ рдЧрд┐рд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рд╕рдорд╛рдзрд╛рди рдПрдХ рдФрд░ рдореВрд▓реНрдп рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рд╣реИ, рдЬрд┐рд╕ рд╕рдордп рд╣рдо рдЖрдЦрд┐рд░реА рдлреНрд░реЗрдо рдХреЗ рдкреАрдЯреАрдПрд╕ рдкрд░ рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ ред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рдХрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп PTS_of_last_frame + ( current_time - time_elapsed_since_PTS_value_was_set) рд╣реЛрдЧрд╛) рдпрд╣ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реИ рдЬреИрд╕рд╛ рд╣рдордиреЗ get_audio_clock рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛ редрддреЛ, рд╣рдорд╛рд░реА рдкреВрд░реНрдг рд╡рд┐рдХрд╕рд┐рдд рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╣рдо рдбрдмрд▓ рд╡реАрдбрд┐рдпреЛ_рдХреНрд░рдВрдЯ_рдЗрдкреНрд╕ рдФрд░ рдЗрдВрдЯрд┐_64 рд╡реАрдбрд┐рдпреЛ рдЯреА_рдХреНрд░рд╛рдВрддрд┐_рдкреНрд░реЗрд╢_рдЯрд╛рдЗрдо рдбрд╛рд▓рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ ред рдШрдбрд╝реА рдХреЛ video_refresh_timer рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ :void video_refresh_timer(void *userdata) {
if(is->video_st) {
if(is->pictq_size == 0) {
schedule_refresh(is, 1);
} else {
vp = &is->pictq[is->pictq_rindex];
is->video_current_pts = vp->pts;
is->video_current_pts_time = av_gettime();
рдЗрд╕реЗ initial_component_open рдореЗрдВ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ :is->video_current_pts_time = av_gettime();
рдФрд░ рдЕрдм рд╣рдо рд╕рднреА рдХреЛ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП:double get_video_clock(VideoState *is) {
double delta;
delta = (av_gettime() - is->video_current_pts_time) / 1000000.0;
return is->video_current_pts + delta;
}
рдШрдбрд╝реА рд╕реЗ рд╕рд╛рд░
рд▓реЗрдХрд┐рди рдПрдХ рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдХреНрдпреЛрдВ рдордЬрдмреВрд░ рдХрд░реЗрдВ? рдЖрдк рдЖрдЧреЗ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рд╣рдорд╛рд░реЗ рд╡реАрдбрд┐рдпреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЛрдб рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рдПрдХ рджреВрд╕рд░реЗ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рди рдХрд░реЗрдВред рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рдЕрдЧрд░ рд╣рдо рдХрдорд╛рдВрдб рд▓рд╛рдЗрди рд╡рд┐рдХрд▓реНрдк рдХреЗ рд╕рд╛рде рдРрд╕рд╛ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВрдЧреЗ, рддреЛ рдЬреИрд╕рд╛ рдХрд┐ FFplay рдореЗрдВ рд╣реИред рддреЛ, рдЪрд▓рд┐рдП рдЕрдореВрд░реНрдд рдХрд░рддреЗ рд╣реИрдВ: рд╣рдо рдПрдХ рдирдпрд╛ рдЖрд╡рд░рдг рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рдПрдВрдЧреЗ , get_master_clock , рдЬреЛ рдЪрд░ av_sync_type рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ , рдФрд░ рдлрд┐рд░ get_audio_clock , get_video_clock , рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдШрдбрд╝реА рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреА рд╣реИред рд╣рдо рдПрдХ рдХрдВрдкреНрдпреВрдЯрд░ рдШрдбрд╝реА рдХрд╛ рдЙрдкрдпреЛрдЧ рднреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдо get_external_clock рдХрд╣рддреЗ рд╣реИрдВ :enum {
AV_SYNC_AUDIO_MASTER,
AV_SYNC_VIDEO_MASTER,
AV_SYNC_EXTERNAL_MASTER,
};
#define DEFAULT_AV_SYNC_TYPE AV_SYNC_VIDEO_MASTER
double get_master_clock(VideoState *is) {
if(is->av_sync_type == AV_SYNC_VIDEO_MASTER) {
return get_video_clock(is);
} else if(is->av_sync_type == AV_SYNC_AUDIO_MASTER) {
return get_audio_clock(is);
} else {
return get_external_clock(is);
}
}
main() {
...
is->av_sync_type = DEFAULT_AV_SYNC_TYPE;
...
}
рдСрдбрд┐рдпреЛ рд╕рд┐рдВрдХ
рдЕрдм рд╕рдмрд╕реЗ рдХрдард┐рди рднрд╛рдЧ: рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рдХреЗ рд╕рд╛рде рдСрдбрд┐рдпреЛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ред рд╣рдорд╛рд░реА рд░рдгрдиреАрддрд┐ рдпрд╣ рдорд╛рдкрдирд╛ рд╣реИ рдХрд┐ рдСрдбрд┐рдпреЛ рдХрд╣рд╛рдВ рд╣реИ, рдЗрд╕рдХреА рддреБрд▓рдирд╛ рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рд╕реЗ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ рдкрддрд╛ рд▓рдЧрд╛рдПрдВ рдХрд┐ рд╣рдореЗрдВ рдХрд┐рддрдиреЗ рдирдореВрдиреЛрдВ рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛рдиреА, рд╣рдореЗрдВ рдирдореВрдиреЛрдВ рдХреЛ рдЫреЛрдбрд╝рдиреЗ рдпрд╛ рдЬреЛрдбрд╝рдХрд░ рдзреАрдорд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдЬрдм рднреА рд╣рдо рдЗрд╕ рд╕реЗрдЯ рдХреЛ рдареАрдХ рд╕реЗ рдХрдо рдХрд░рдиреЗ рдпрд╛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╣рд░ рдмрд╛рд░ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝_рдСрдбрд┐рдпреЛрдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рд╣рд░ рд╕рдордп рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдСрдбрд┐рдпреЛ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╡реАрдбрд┐рдпреЛ рдкреИрдХреЗрдЯ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрд╛рд░ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝_рдСрдбрд┐рдпреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдХреЙрд▓ рдХреА рдиреНрдпреВрдирддрдо рд╕рдВрдЦреНрдпрд╛ рд╕реЗрдЯ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВрдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдХреБрдЫ рднреА рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдЙрдард╛рдПрдВ, рдЙрд╕реЗ рдЕрдирд╕рдВрдХрдЯреЗрдб рдорд╛рдирд╛ рдЬрд╛рдПред рдмреЗрд╢рдХ, рдкрд┐рдЫрд▓реА рдмрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ, "рдЕрдирд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди" рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдСрдбрд┐рдпреЛ рдШрдбрд╝реА рдФрд░ рд╡реАрдбрд┐рдпреЛ рдШрдбрд╝реА рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдереНрд░реЗрд╢реЛрд▓реНрдб рд╕реЗ рдЕрдзрд┐рдХ рд░рд╛рд╢рд┐ рд╕реЗ рднрд┐рдиреНрди рд╣реЛрддреА рд╣реИредрддреЛ рд╣рдо рдПрдХ рднрд┐рдиреНрдирд╛рддреНрдордХ рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ, рдПрд╕ , рдФрд░ рдЕрдм, рдЪрд▓реЛ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдореЗрдВ рдПрди рдорд┐рд▓рд╛рдСрдбрд┐рдпреЛ рдирдореВрдиреЛрдВ рдХреЗ рд╕реЗрдЯ рдЬреЛ рд╕рд┐рдВрдХ рд╕реЗ рдмрд╛рд╣рд░ рдереЗред рдЬрд┐рди рдирдореВрдиреЛрдВ рдХреА рд╣рдо рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рднреА рдмрд╣реБрдд рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдФрд╕рдд рдореВрд▓реНрдп рд▓реЗрддреЗ рд╣реИрдВ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХрд┐рддрдирд╛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓рд╛ рдХреЙрд▓ рджрд┐рдЦрд╛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо 40 рдПрдордПрд╕ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рд╣реИрдВ, 50 рдПрдордПрд╕ рдХреЗ рд▓рд┐рдП рдЕрдЧрд▓рд╛ рдФрд░ рдЗрд╕реА рддрд░рд╣ред рд▓реЗрдХрд┐рди рд╣рдо рдПрдХ рд╕рд░рд▓ рдорддрд▓рдм рдирд╣реАрдВ рд▓реЗрдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╕рдмрд╕реЗ рд╣рд╛рд▓ рдХреЗ рдореВрд▓реНрдп рдЙрди рд▓реЛрдЧреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВ рдЬреЛ рдЙрдирдХреЗ рд╕рд╛рдордиреЗ рдЖрддреЗ рд╣реИрдВред рддреЛ, рд╣рдо рдПрдХ рднрд┐рдиреНрди рдЧреБрдгрд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХрд╣рддреЗ рд╣реИрдВ, рдЧ , рдФрд░ рдЕрдВрддрд░ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ: diff_sum = new_diff + diff_sum * c ред рдЬрдм рд╣рдо рдФрд╕рдд рдЕрдВрддрд░ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдмрд╕ avg_diff = рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВdiff_sum * (1 - c )редрдпрд╣рд╛рдВ рдХреНрдпрд╛ рдмрдХрд╡рд╛рд╕ рдЪрд▓ рд░рд╣реА рд╣реИ? рд╕рдореАрдХрд░рдг рдХрд┐рд╕реА рддрд░рд╣ рдХреЗ рдЬрд╛рджреВ рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдЦреИрд░, рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рднрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЬреНрдпрд╛рдорд┐рддреАрдп рд╢реНрд░реГрдВрдЦрд▓рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рднрд╛рд░рд┐рдд рдФрд╕рдд рд╣реИред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЗрд╕рдХреЗ рд▓рд┐рдП рдХреЛрдИ рдирд╛рдо рд╣реИ (рдореИрдВрдиреЗ рд╡рд┐рдХрд┐рдкреАрдбрд┐рдпрд╛ рдкрд░ рднреА рдЬрд╛рдБрдЪ рдХреА рд╣реИ!), рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдпрд╣рд╛рдБ рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рд╣реИ (рдпрд╛ рдпрд╣рд╛рдБ: weightedmean.txt )редрдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
int synchronize_audio(VideoState *is, short *samples,
int samples_size, double pts) {
int n;
double ref_clock;
n = 2 * is->audio_st->codec->channels;
if(is->av_sync_type != AV_SYNC_AUDIO_MASTER) {
double diff, avg_diff;
int wanted_size, min_size, max_size, nb_samples;
ref_clock = get_master_clock(is);
diff = get_audio_clock(is) - ref_clock;
if(diff < AV_NOSYNC_THRESHOLD) {
is->audio_diff_cum = diff + is->audio_diff_avg_coef
* is->audio_diff_cum;
if(is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {
is->audio_diff_avg_count++;
} else {
avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);
}
} else {
is->audio_diff_avg_count = 0;
is->audio_diff_cum = 0;
}
}
return samples_size;
}
рддреЛ рд╣рдорд╛рд░реЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ; рд╣рдо рд▓рдЧрднрдЧ рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдзреНрд╡рдирд┐ рд╡реАрдбрд┐рдпреЛ рдХреЗ рд╕рд╛рде рдпрд╛ рд╣рдо рдПрдХ рдШрдбрд╝реА рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рдирд╣реАрдВ рд╣реИред рддреЛ, рдЪрд▓рд┐рдП рдЕрдм рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЗрд╕ рдХреЛрдб рдХреЛ "рдмрдлрд░ рдХреЛрдб рдХреЛ рдХрдо рдХрд░рдирд╛ / рдмрдврд╝рд╛рдирд╛" рдХрд░рдХреЗ рдЗрд╕ рдХреЛрдб рдореЗрдВ рдХрд┐рддрдиреЗ рдирдореВрдиреЗ рдЬреЛрдбрд╝рдиреЗ рдпрд╛ рддреНрдпрд╛рдЧрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:if(fabs(avg_diff) >= is->audio_diff_threshold) {
wanted_size = samples_size +
((int)(diff * is->audio_st->codec->sample_rate) * n);
min_size = samples_size * ((100 - SAMPLE_CORRECTION_PERCENT_MAX)
/ 100);
max_size = samples_size * ((100 + SAMPLE_CORRECTION_PERCENT_MAX)
/ 100);
if(wanted_size < min_size) {
wanted_size = min_size;
} else if (wanted_size > max_size) {
wanted_size = max_size;
}
рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ Audio_length * ( sample_rate * # of channel * 2) рдСрдбрд┐рдпреЛ рдХреЗ Audio_length рд╕реЗрдХрдВрдб рдореЗрдВ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ ред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЬрд┐рддрдиреЗ рдирдореВрдиреЗ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡реЗ рдЙрди рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдВрдЧреЗ рдЬреЛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реИрдВ, рдпрд╛ рдЙрди рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╢реВрдиреНрдп рд╣реИ рдЬреЛ рдЙрд╕ рд╕рдордп рдХреА рдорд╛рддреНрд░рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдзреНрд╡рдирд┐ рдмрдЬрд╛рдИ рдЧрдИ рдереАред рд╣рдо рдЗрд╕ рдкрд░ рднреА рдПрдХ рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВрдЧреЗ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕реБрдзрд╛рд░ рдХрд┐рддрдирд╛ рдмрдбрд╝рд╛ рдпрд╛ рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдмрдлрд░ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдХрд╖реНрдЯрдкреНрд░рдж рд╣реЛрдЧрд╛редрдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рд╕реБрдзрд╛рд░
рдЕрдм рд╣рдореЗрдВ рдзреНрд╡рдирд┐ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдЖрдкрдиреЗ рджреЗрдЦрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝_рдСрдбрд┐рдпреЛ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирдореВрдирд╛ рдЖрдХрд╛рд░ рджреЗрддрд╛ рд╣реИ, рдЬреЛ рддрдм рд╣рдореЗрдВ рдпрд╣ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рдХреЛ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рд╣рдореЗрдВ рдмрд╕ рдирдореВрдирд╛ рдЖрдХрд╛рд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдореВрд▓реНрдп рдореЗрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдирдореВрдирд╛ рдЖрдХрд╛рд░ рдХреЛ рдХрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдкрдХреЛ рдЗрд╕реЗ рдмрдврд╝рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдХреЗрд╡рд▓ рдирдореВрдирд╛ рдЖрдХрд╛рд░ рдирд╣реАрдВ рдмрдврд╝рд╛ рд╕рдХрддреЗ, рдХреНрдпреЛрдВрдХрд┐ рдмрдлрд░ рдореЗрдВ рдЕрдзрд┐рдХ рдбреЗрдЯрд╛ рдирд╣реАрдВ рд╣реИ! рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдереЛрдбрд╝рд╛ рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ? рдСрдбрд┐рдпреЛ рдХреЛ рдПрдХреНрд╕рдЯреНрд░рдкрд▓реЗрд╢рди рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдирд╛ рдореВрд░реНрдЦрддрд╛рдкреВрд░реНрдг рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЪрд▓рд┐рдП рдкрд┐рдЫрд▓реЗ рдирдореВрдиреЗ рдХреЗ рдореВрд▓реНрдп рдХреЛ рдмрдлрд░ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реБрдП рдСрдбрд┐рдпреЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредif(wanted_size < samples_size) {
samples_size = wanted_size;
} else if(wanted_size > samples_size) {
uint8_t *samples_end, *q;
int nb;
nb = (samples_size - wanted_size);
samples_end = (uint8_t *)samples + samples_size - n;
q = samples_end + n;
while(nb > 0) {
memcpy(q, samples_end, n);
q += n;
nb -= n;
}
samples_size = wanted_size;
}
рдЕрдм рд╣рдо рдирдореВрдирд╛ рдЖрдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЕрдм рд╣рдореЗрдВ рдмрд╕ рдпрд╣реА рдХрд░рдирд╛ рд╣реИ:void audio_callback(void *userdata, Uint8 *stream, int len) {
VideoState *is = (VideoState *)userdata;
int len1, audio_size;
double pts;
while(len > 0) {
if(is->audio_buf_index >= is->audio_buf_size) {
audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts);
if(audio_size < 0) {
is->audio_buf_size = 1024;
memset(is->audio_buf, 0, is->audio_buf_size);
} else {
audio_size = synchronize_audio(is, (int16_t *)is->audio_buf,
audio_size, pts);
is->audio_buf_size = audio_size;
рд╣рдордиреЗ рдЬреЛ рдХреБрдЫ рдХрд┐рдпрд╛ рдерд╛, рд╡рд╣ рд╕рд┐рдВрдХреНрд░реЛрдирд╛рдЗрдЬрд╝_рдСрдбрд┐рдпреЛ рдХреЙрд▓ рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░ рд░рд╣рд╛ рдерд╛ ред (рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЙрди рдЪрд░реЛрдВ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдореИрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рддрд╛ред)рдФрд░ рдЕрдВрддрд┐рдо, рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рд╕рдорд╛рдкреНрдд рдХрд░реЗрдВ: рд╣рдореЗрдВ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП "рдпрджрд┐" рд╢рд░реНрдд рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╣рдо рд╡реАрдбрд┐рдпреЛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ: рдпрд╣ рдореБрдЦреНрдп рдШрдбрд╝реА рд╣реИ:if(is->av_sync_type != AV_SYNC_VIDEO_MASTER) {
ref_clock = get_master_clock(is);
diff = vp->pts - ref_clock;
sync_threshold = (delay > AV_SYNC_THRESHOLD) ? delay :
AV_SYNC_THRESHOLD;
if(fabs(diff) < AV_NOSYNC_THRESHOLD) {
if(diff <= -sync_threshold) {
delay = 0;
} else if(diff >= sync_threshold) {
delay = 2 * delay;
}
}
}
рдФрд░ рдпрд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрд░реНрд╕ рдлрд╛рдЗрд▓ рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдбрд┐рдлрд╛рдЗрди рдпрд╛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЬрд╣рдордд рдирд╣реАрдВ рдЙрдард╛рдИред рдлрд┐рд░ рд╕рдВрдХрд▓рди рдХрд░реЗрдВ:gcc -o tutorial06 tutorial06.c -lavutil -lavformat -lavcodec -lswscale -lz -lm \
`sdl-config --cflags --libs`
рдФрд░ рдЙрдбрд╝рд╛рди рд╕рд╛рдорд╛рдиреНрдп рд╣реЛрдЧреАредрдЕрдВрддрд┐рдо рдкрд╛рда рдореЗрдВ рд╣рдо рдЙрд▓реНрдЯрд╛ рдХрд░реЗрдВрдЧреЗред
рдкрд╛рда 7: рдЦреЛрдЬ тЖР ред тЖТ
рдкреВрд░реА рд▓рд┐рд╕реНрдЯрд┐рдВрдЧ tutorial07.c
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <SDL.h>
#include <SDL_thread.h>
#ifdef __MINGW32__
#undef main
#endif
#include <stdio.h>
#include <assert.h>
#include <math.h>
#if LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55,28,1)
#define av_frame_alloc avcodec_alloc_frame
#define av_frame_free avcodec_free_frame
#endif
#define SDL_AUDIO_BUFFER_SIZE 1024
#define MAX_AUDIO_FRAME_SIZE 192000
#define MAX_AUDIOQ_SIZE (5 * 16 * 1024)
#define MAX_VIDEOQ_SIZE (5 * 256 * 1024)
#define AV_SYNC_THRESHOLD 0.01
#define AV_NOSYNC_THRESHOLD 10.0
#define SAMPLE_CORRECTION_PERCENT_MAX 10
#define AUDIO_DIFF_AVG_NB 20
#define FF_REFRESH_EVENT (SDL_USEREVENT)
#define FF_QUIT_EVENT (SDL_USEREVENT + 1)
#define VIDEO_PICTURE_QUEUE_SIZE 1
#define DEFAULT_AV_SYNC_TYPE AV_SYNC_VIDEO_MASTER
typedef struct PacketQueue {
AVPacketList *first_pkt, *last_pkt;
int nb_packets;
int size;
SDL_mutex *mutex;
SDL_cond *cond;
} PacketQueue;
typedef struct VideoPicture {
SDL_Overlay *bmp;
int width, height;
int allocated;
double pts;
} VideoPicture;
typedef struct VideoState {
AVFormatContext *pFormatCtx;
int videoStream, audioStream;
int av_sync_type;
double external_clock;
int64_t external_clock_time;
int seek_req;
int seek_flags;
int64_t seek_pos;
double audio_clock;
AVStream *audio_st;
AVCodecContext *audio_ctx;
PacketQueue audioq;
uint8_t audio_buf[(AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2];
unsigned int audio_buf_size;
unsigned int audio_buf_index;
AVFrame audio_frame;
AVPacket audio_pkt;
uint8_t *audio_pkt_data;
int audio_pkt_size;
int audio_hw_buf_size;
double audio_diff_cum;
double audio_diff_avg_coef;
double audio_diff_threshold;
int audio_diff_avg_count;
double frame_timer;
double frame_last_pts;
double frame_last_delay;
double video_clock;
double video_current_pts;
int64_t video_current_pts_time;
AVStream *video_st;
AVCodecContext *video_ctx;
PacketQueue videoq;
struct SwsContext *sws_ctx;
VideoPicture pictq[VIDEO_PICTURE_QUEUE_SIZE];
int pictq_size, pictq_rindex, pictq_windex;
SDL_mutex *pictq_mutex;
SDL_cond *pictq_cond;
SDL_Thread *parse_tid;
SDL_Thread *video_tid;
char filename[1024];
int quit;
} VideoState;
enum {
AV_SYNC_AUDIO_MASTER,
AV_SYNC_VIDEO_MASTER,
AV_SYNC_EXTERNAL_MASTER,
};
SDL_Surface *screen;
SDL_mutex *screen_mutex;
VideoState *global_video_state;
AVPacket flush_pkt;
void packet_queue_init(PacketQueue *q) {
memset(q, 0, sizeof(PacketQueue));
q->mutex = SDL_CreateMutex();
q->cond = SDL_CreateCond();
}
int packet_queue_put(PacketQueue *q, AVPacket *pkt) {
AVPacketList *pkt1;
if(pkt != &flush_pkt && av_dup_packet(pkt) < 0) {
return -1;
}
pkt1 = av_malloc(sizeof(AVPacketList));
if (!pkt1)
return -1;
pkt1->pkt = *pkt;
pkt1->next = NULL;
SDL_LockMutex(q->mutex);
if (!q->last_pkt)
q->first_pkt = pkt1;
else
q->last_pkt->next = pkt1;
q->last_pkt = pkt1;
q->nb_packets++;
q->size += pkt1->pkt.size;
SDL_CondSignal(q->cond);
SDL_UnlockMutex(q->mutex);
return 0;
}
static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block)
{
AVPacketList *pkt1;
int ret;
SDL_LockMutex(q->mutex);
for(;;) {
if(global_video_state->quit) {
ret = -1;
break;
}
pkt1 = q->first_pkt;
if (pkt1) {
q->first_pkt = pkt1->next;
if (!q->first_pkt)
q->last_pkt = NULL;
q->nb_packets--;
q->size -= pkt1->pkt.size;
*pkt = pkt1->pkt;
av_free(pkt1);
ret = 1;
break;
} else if (!block) {
ret = 0;
break;
} else {
SDL_CondWait(q->cond, q->mutex);
}
}
SDL_UnlockMutex(q->mutex);
return ret;
}
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->nb_packets = 0;
q->size = 0;
SDL_UnlockMutex(q->mutex);
}
double get_audio_clock(VideoState *is) {
double pts;
int hw_buf_size, bytes_per_sec, n;
pts = is->audio_clock;
hw_buf_size = is->audio_buf_size - is->audio_buf_index;
bytes_per_sec = 0;
n = is->audio_ctx->channels * 2;
if(is->audio_st) {
bytes_per_sec = is->audio_ctx->sample_rate * n;
}
if(bytes_per_sec) {
pts -= (double)hw_buf_size / bytes_per_sec;
}
return pts;
}
double get_video_clock(VideoState *is) {
double delta;
delta = (av_gettime() - is->video_current_pts_time) / 1000000.0;
return is->video_current_pts + delta;
}
double get_external_clock(VideoState *is) {
return av_gettime() / 1000000.0;
}
double get_master_clock(VideoState *is) {
if(is->av_sync_type == AV_SYNC_VIDEO_MASTER) {
return get_video_clock(is);
} else if(is->av_sync_type == AV_SYNC_AUDIO_MASTER) {
return get_audio_clock(is);
} else {
return get_external_clock(is);
}
}
int synchronize_audio(VideoState *is, short *samples,
int samples_size, double pts) {
int n;
double ref_clock;
n = 2 * is->audio_ctx->channels;
if(is->av_sync_type != AV_SYNC_AUDIO_MASTER) {
double diff, avg_diff;
int wanted_size, min_size, max_size ;
ref_clock = get_master_clock(is);
diff = get_audio_clock(is) - ref_clock;
if(diff < AV_NOSYNC_THRESHOLD) {
is->audio_diff_cum = diff + is->audio_diff_avg_coef
* is->audio_diff_cum;
if(is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {
is->audio_diff_avg_count++;
} else {
avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);
if(fabs(avg_diff) >= is->audio_diff_threshold) {
wanted_size = samples_size + ((int)(diff * is->audio_ctx->sample_rate) * n);
min_size = samples_size * ((100 - SAMPLE_CORRECTION_PERCENT_MAX) / 100);
max_size = samples_size * ((100 + SAMPLE_CORRECTION_PERCENT_MAX) / 100);
if(wanted_size < min_size) {
wanted_size = min_size;
} else if (wanted_size > max_size) {
wanted_size = max_size;
}
if(wanted_size < samples_size) {
samples_size = wanted_size;
} else if(wanted_size > samples_size) {
uint8_t *samples_end, *q;
int nb;
nb = (samples_size - wanted_size);
samples_end = (uint8_t *)samples + samples_size - n;
q = samples_end + n;
while(nb > 0) {
memcpy(q, samples_end, n);
q += n;
nb -= n;
}
samples_size = wanted_size;
}
}
}
} else {
is->audio_diff_avg_count = 0;
is->audio_diff_cum = 0;
}
}
return samples_size;
}
int audio_decode_frame(VideoState *is, uint8_t *audio_buf, int buf_size, double *pts_ptr) {
int len1, data_size = 0;
AVPacket *pkt = &is->audio_pkt;
double pts;
int n;
for(;;) {
while(is->audio_pkt_size > 0) {
int got_frame = 0;
len1 = avcodec_decode_audio4(is->audio_ctx, &is->audio_frame, &got_frame, pkt);
if(len1 < 0) {
is->audio_pkt_size = 0;
break;
}
data_size = 0;
if(got_frame) {
data_size = av_samples_get_buffer_size(NULL,
is->audio_ctx->channels,
is->audio_frame.nb_samples,
is->audio_ctx->sample_fmt,
1);
assert(data_size <= buf_size);
memcpy(audio_buf, is->audio_frame.data[0], data_size);
}
is->audio_pkt_data += len1;
is->audio_pkt_size -= len1;
if(data_size <= 0) {
continue;
}
pts = is->audio_clock;
*pts_ptr = pts;
n = 2 * is->audio_ctx->channels;
is->audio_clock += (double)data_size /
(double)(n * is->audio_ctx->sample_rate);
return data_size;
}
if(pkt->data)
av_free_packet(pkt);
if(is->quit) {
return -1;
}
if(packet_queue_get(&is->audioq, pkt, 1) < 0) {
return -1;
}
if(pkt->data == flush_pkt.data) {
avcodec_flush_buffers(is->audio_ctx);
continue;
}
is->audio_pkt_data = pkt->data;
is->audio_pkt_size = pkt->size;
if(pkt->pts != AV_NOPTS_VALUE) {
is->audio_clock = av_q2d(is->audio_st->time_base)*pkt->pts;
}
}
}
void audio_callback(void *userdata, Uint8 *stream, int len) {
VideoState *is = (VideoState *)userdata;
int len1, audio_size;
double pts;
while(len > 0) {
if(is->audio_buf_index >= is->audio_buf_size) {
audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts);
if(audio_size < 0) {
is->audio_buf_size = 1024;
memset(is->audio_buf, 0, is->audio_buf_size);
} else {
audio_size = synchronize_audio(is, (int16_t *)is->audio_buf,
audio_size, pts);
is->audio_buf_size = audio_size;
}
is->audio_buf_index = 0;
}
len1 = is->audio_buf_size - is->audio_buf_index;
if(len1 > len)
len1 = len;
memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
len -= len1;
stream += len1;
is->audio_buf_index += len1;
}
}
static Uint32 sdl_refresh_timer_cb(Uint32 interval, void *opaque) {
SDL_Event event;
event.type = FF_REFRESH_EVENT;
event.user.data1 = opaque;
SDL_PushEvent(&event);
return 0;
}
static void schedule_refresh(VideoState *is, int delay) {
SDL_AddTimer(delay, sdl_refresh_timer_cb, is);
}
void video_display(VideoState *is) {
SDL_Rect rect;
VideoPicture *vp;
float aspect_ratio;
int w, h, x, y;
int i;
vp = &is->pictq[is->pictq_rindex];
if(vp->bmp) {
if(is->video_ctx->sample_aspect_ratio.num == 0) {
aspect_ratio = 0;
} else {
aspect_ratio = av_q2d(is->video_ctx->sample_aspect_ratio) *
is->video_ctx->width / is->video_ctx->height;
}
if(aspect_ratio <= 0.0) {
aspect_ratio = (float)is->video_ctx->width /
(float)is->video_ctx->height;
}
h = screen->h;
w = ((int)rint(h * aspect_ratio)) & -3;
if(w > screen->w) {
w = screen->w;
h = ((int)rint(w / aspect_ratio)) & -3;
}
x = (screen->w - w) / 2;
y = (screen->h - h) / 2;
rect.x = x;
rect.y = y;
rect.w = w;
rect.h = h;
SDL_LockMutex(screen_mutex);
SDL_DisplayYUVOverlay(vp->bmp, &rect);
SDL_UnlockMutex(screen_mutex);
}
}
void video_refresh_timer(void *userdata) {
VideoState *is = (VideoState *)userdata;
VideoPicture *vp;
double actual_delay, delay, sync_threshold, ref_clock, diff;
if(is->video_st) {
if(is->pictq_size == 0) {
schedule_refresh(is, 1);
} else {
vp = &is->pictq[is->pictq_rindex];
is->video_current_pts = vp->pts;
is->video_current_pts_time = av_gettime();
delay = vp->pts - is->frame_last_pts;
if(delay <= 0 || delay >= 1.0) {
delay = is->frame_last_delay;
}
is->frame_last_delay = delay;
is->frame_last_pts = vp->pts;
if(is->av_sync_type != AV_SYNC_VIDEO_MASTER) {
ref_clock = get_master_clock(is);
diff = vp->pts - ref_clock;
sync_threshold = (delay > AV_SYNC_THRESHOLD) ? delay : AV_SYNC_THRESHOLD;
if(fabs(diff) < AV_NOSYNC_THRESHOLD) {
if(diff <= -sync_threshold) {
delay = 0;
} else if(diff >= sync_threshold) {
delay = 2 * delay;
}
}
}
is->frame_timer += delay;
actual_delay = is->frame_timer - (av_gettime() / 1000000.0);
if(actual_delay < 0.010) {
actual_delay = 0.010;
}
schedule_refresh(is, (int)(actual_delay * 1000 + 0.5));
video_display(is);
if(++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE) {
is->pictq_rindex = 0;
}
SDL_LockMutex(is->pictq_mutex);
is->pictq_size--;
SDL_CondSignal(is->pictq_cond);
SDL_UnlockMutex(is->pictq_mutex);
}
} else {
schedule_refresh(is, 100);
}
}
void alloc_picture(void *userdata) {
VideoState *is = (VideoState *)userdata;
VideoPicture *vp;
vp = &is->pictq[is->pictq_windex];
if(vp->bmp) {
SDL_FreeYUVOverlay(vp->bmp);
}
SDL_LockMutex(screen_mutex);
vp->bmp = SDL_CreateYUVOverlay(is->video_ctx->width,
is->video_ctx->height,
SDL_YV12_OVERLAY,
screen);
SDL_UnlockMutex(screen_mutex);
vp->width = is->video_ctx->width;
vp->height = is->video_ctx->height;
vp->allocated = 1;
}
int queue_picture(VideoState *is, AVFrame *pFrame, double pts) {
VideoPicture *vp;
int dst_pix_fmt;
AVPicture pict;
SDL_LockMutex(is->pictq_mutex);
while(is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE &&
!is->quit) {
SDL_CondWait(is->pictq_cond, is->pictq_mutex);
}
SDL_UnlockMutex(is->pictq_mutex);
if(is->quit)
return -1;
vp = &is->pictq[is->pictq_windex];
if(!vp->bmp ||
vp->width != is->video_ctx->width ||
vp->height != is->video_ctx->height) {
SDL_Event event;
vp->allocated = 0;
alloc_picture(is);
if(is->quit) {
return -1;
}
}
if(vp->bmp) {
SDL_LockYUVOverlay(vp->bmp);
vp->pts = pts;
dst_pix_fmt = PIX_FMT_YUV420P;
pict.data[0] = vp->bmp->pixels[0];
pict.data[1] = vp->bmp->pixels[2];
pict.data[2] = vp->bmp->pixels[1];
pict.linesize[0] = vp->bmp->pitches[0];
pict.linesize[1] = vp->bmp->pitches[2];
pict.linesize[2] = vp->bmp->pitches[1];
sws_scale(is->sws_ctx, (uint8_t const * const *)pFrame->data,
pFrame->linesize, 0, is->video_ctx->height,
pict.data, pict.linesize);
SDL_UnlockYUVOverlay(vp->bmp);
if(++is->pictq_windex == VIDEO_PICTURE_QUEUE_SIZE) {
is->pictq_windex = 0;
}
SDL_LockMutex(is->pictq_mutex);
is->pictq_size++;
SDL_UnlockMutex(is->pictq_mutex);
}
return 0;
}
double synchronize_video(VideoState *is, AVFrame *src_frame, double pts) {
double frame_delay;
if(pts != 0) {
is->video_clock = pts;
} else {
pts = is->video_clock;
}
frame_delay = av_q2d(is->video_ctx->time_base);
frame_delay += src_frame->repeat_pict * (frame_delay * 0.5);
is->video_clock += frame_delay;
return pts;
}
int video_thread(void *arg) {
VideoState *is = (VideoState *)arg;
AVPacket pkt1, *packet = &pkt1;
int frameFinished;
AVFrame *pFrame;
double pts;
pFrame = av_frame_alloc();
for(;;) {
if(packet_queue_get(&is->videoq, packet, 1) < 0) {
break;
}
if(packet_queue_get(&is->videoq, packet, 1) < 0) {
break;
}
pts = 0;
avcodec_decode_video2(is->video_ctx, pFrame, &frameFinished, packet);
if((pts = av_frame_get_best_effort_timestamp(pFrame)) == AV_NOPTS_VALUE) {
pts = av_frame_get_best_effort_timestamp(pFrame);
} else {
pts = 0;
}
pts *= av_q2d(is->video_st->time_base);
if(frameFinished) {
pts = synchronize_video(is, pFrame, pts);
if(queue_picture(is, pFrame, pts) < 0) {
break;
}
}
av_free_packet(packet);
}
av_frame_free(&pFrame);
return 0;
}
int stream_component_open(VideoState *is, int stream_index) {
AVFormatContext *pFormatCtx = is->pFormatCtx;
AVCodecContext *codecCtx = NULL;
AVCodec *codec = NULL;
SDL_AudioSpec wanted_spec, spec;
if(stream_index < 0 || stream_index >= pFormatCtx->nb_streams) {
return -1;
}
codec = avcodec_find_decoder(pFormatCtx->streams[stream_index]->codec->codec_id);
if(!codec) {
fprintf(stderr, "Unsupported codec!\n");
return -1;
}
codecCtx = avcodec_alloc_context3(codec);
if(avcodec_copy_context(codecCtx, pFormatCtx->streams[stream_index]->codec) != 0) {
fprintf(stderr, "Couldn't copy codec context");
return -1;
}
if(codecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
wanted_spec.freq = codecCtx->sample_rate;
wanted_spec.format = AUDIO_S16SYS;
wanted_spec.channels = codecCtx->channels;
wanted_spec.silence = 0;
wanted_spec.samples = SDL_AUDIO_BUFFER_SIZE;
wanted_spec.callback = audio_callback;
wanted_spec.userdata = is;
if(SDL_OpenAudio(&wanted_spec, &spec) < 0) {
fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError());
return -1;
}
is->audio_hw_buf_size = spec.size;
}
if(avcodec_open2(codecCtx, codec, NULL) < 0) {
fprintf(stderr, "Unsupported codec!\n");
return -1;
}
switch(codecCtx->codec_type) {
case AVMEDIA_TYPE_AUDIO:
is->audioStream = stream_index;
is->audio_st = pFormatCtx->streams[stream_index];
is->audio_ctx = codecCtx;
is->audio_buf_size = 0;
is->audio_buf_index = 0;
memset(&is->audio_pkt, 0, sizeof(is->audio_pkt));
packet_queue_init(&is->audioq);
SDL_PauseAudio(0);
break;
case AVMEDIA_TYPE_VIDEO:
is->videoStream = stream_index;
is->video_st = pFormatCtx->streams[stream_index];
is->video_ctx = codecCtx;
is->frame_timer = (double)av_gettime() / 1000000.0;
is->frame_last_delay = 40e-3;
is->video_current_pts_time = av_gettime();
packet_queue_init(&is->videoq);
is->video_tid = SDL_CreateThread(video_thread, is);
is->sws_ctx = sws_getContext(is->video_ctx->width, is->video_ctx->height,
is->video_ctx->pix_fmt, is->video_ctx->width,
is->video_ctx->height, PIX_FMT_YUV420P,
SWS_BILINEAR, NULL, NULL, NULL
);
break;
default:
break;
}
}
int decode_thread(void *arg) {
VideoState *is = (VideoState *)arg;
AVFormatContext *pFormatCtx;
AVPacket pkt1, *packet = &pkt1;
int video_index = -1;
int audio_index = -1;
int i;
is->videoStream=-1;
is->audioStream=-1;
global_video_state = is;
if(avformat_open_input(&pFormatCtx, is->filename, NULL, NULL)!=0)
return -1;
is->pFormatCtx = pFormatCtx;
if(avformat_find_stream_info(pFormatCtx, NULL)<0)
return -1;
av_dump_format(pFormatCtx, 0, is->filename, 0);
for(i=0; i<pFormatCtx->nb_streams; i++) {
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_VIDEO &&
video_index < 0) {
video_index=i;
}
if(pFormatCtx->streams[i]->codec->codec_type==AVMEDIA_TYPE_AUDIO &&
audio_index < 0) {
audio_index=i;
}
}
if(audio_index >= 0) {
stream_component_open(is, audio_index);
}
if(video_index >= 0) {
stream_component_open(is, video_index);
}
if(is->videoStream < 0 || is->audioStream < 0) {
fprintf(stderr, "%s: could not open codecs\n", is->filename);
goto fail;
}
for(;;) {
if(is->quit) {
break;
}
if(is->seek_req) {
int stream_index= -1;
int64_t seek_target = is->seek_pos;
if (is->videoStream >= 0) stream_index = is->videoStream;
else if(is->audioStream >= 0) stream_index = is->audioStream;
if(stream_index>=0){
seek_target= av_rescale_q(seek_target, AV_TIME_BASE_Q,
pFormatCtx->streams[stream_index]->time_base);
}
if(av_seek_frame(is->pFormatCtx, stream_index,
seek_target, is->seek_flags) < 0) {
fprintf(stderr, "%s: error while seeking\n",
is->pFormatCtx->filename);
} else {
if(is->audioStream >= 0) {
packet_queue_flush(&is->audioq);
packet_queue_put(&is->audioq, &flush_pkt);
}
if(is->videoStream >= 0) {
packet_queue_flush(&is->videoq);
packet_queue_put(&is->videoq, &flush_pkt);
}
}
is->seek_req = 0;
}
if(is->audioq.size > MAX_AUDIOQ_SIZE ||
is->videoq.size > MAX_VIDEOQ_SIZE) {
SDL_Delay(10);
continue;
}
if(av_read_frame(is->pFormatCtx, packet) < 0) {
if(is->pFormatCtx->pb->error == 0) {
SDL_Delay(100);
continue;
} else {
break;
}
}
if(packet->stream_index == is->videoStream) {
packet_queue_put(&is->videoq, packet);
} else if(packet->stream_index == is->audioStream) {
packet_queue_put(&is->audioq, packet);
} else {
av_free_packet(packet);
}
}
while(!is->quit) {
SDL_Delay(100);
}
fail:
if(1){
SDL_Event event;
event.type = FF_QUIT_EVENT;
event.user.data1 = is;
SDL_PushEvent(&event);
}
return 0;
}
void stream_seek(VideoState *is, int64_t pos, int rel) {
if(!is->seek_req) {
is->seek_pos = pos;
is->seek_flags = rel < 0 ? AVSEEK_FLAG_BACKWARD : 0;
is->seek_req = 1;
}
}
int main(int argc, char *argv[]) {
SDL_Event event;
VideoState *is;
is = av_mallocz(sizeof(VideoState));
if(argc < 2) {
fprintf(stderr, "Usage: test <file>\n");
exit(1);
}
av_register_all();
if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
exit(1);
}
#ifndef __DARWIN__
screen = SDL_SetVideoMode(640, 480, 0, 0);
#else
screen = SDL_SetVideoMode(640, 480, 24, 0);
#endif
if(!screen) {
fprintf(stderr, "SDL: could not set video mode - exiting\n");
exit(1);
}
screen_mutex = SDL_CreateMutex();
av_strlcpy(is->filename, argv[1], sizeof(is->filename));
is->pictq_mutex = SDL_CreateMutex();
is->pictq_cond = SDL_CreateCond();
schedule_refresh(is, 40);
is->av_sync_type = DEFAULT_AV_SYNC_TYPE;
is->parse_tid = SDL_CreateThread(decode_thread, is);
if(!is->parse_tid) {
av_free(is);
return -1;
}
av_init_packet(&flush_pkt);
flush_pkt.data = "FLUSH";
for(;;) {
double incr, pos;
SDL_WaitEvent(&event);
switch(event.type) {
case SDL_KEYDOWN:
switch(event.key.keysym.sym) {
case SDLK_LEFT:
incr = -10.0;
goto do_seek;
case SDLK_RIGHT:
incr = 10.0;
goto do_seek;
case SDLK_UP:
incr = 60.0;
goto do_seek;
case SDLK_DOWN:
incr = -60.0;
goto do_seek;
do_seek:
if(global_video_state) {
pos = get_master_clock(global_video_state);
pos += incr;
stream_seek(global_video_state, (int64_t)(pos * AV_TIME_BASE), incr);
}
break;
default:
break;
}
break;
case FF_QUIT_EVENT:
case SDL_QUIT:
is->quit = 1;
SDL_CondSignal(is->audioq.cond);
SDL_CondSignal(is->videoq.cond);
SDL_Quit();
return 0;
break;
case FF_REFRESH_EVENT:
video_refresh_timer(event.user.data1);
break;
default:
break;
}
}
return 0;
}
рдХрдорд╛рдВрдб рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдЦреЛрдЬреЗрдВ
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдореЗрдВ рдХреБрдЫ рдЦреЛрдЬ рдХреНрд╖рдорддрд╛рдУрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ рдЬрдм рдЖрдк рдлрд┐рд▓реНрдо рдХреЛ рд░рд┐рд╡рд╛рдЗрдВрдб рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ av_seek_frame рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдХрд┐рддрдирд╛ рдЖрд╕рд╛рди рд╣реИ редрд╣рдо рдХреАрдмреЛрд░реНрдб рдкрд░ рддреАрд░ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ "рдмрд╛рдПрдВ" рдФрд░ "рджрд╛рдПрдВ" рдлрд┐рд▓реНрдо рдХреЛ рдЖрдЧреЗ рдФрд░ рдкреАрдЫреЗ рдереЛрдбрд╝рд╛ рд╕реНрдХреНрд░реЙрд▓ рдХрд░реЗрдВ, рдФрд░ рддреАрд░ "рдКрдкрд░" рдФрд░ "рдиреАрдЪреЗ" рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдзрд┐рдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИрдВред "рдереЛрдбрд╝рд╛" - рдпрд╣ 10 рд╕реЗрдХрдВрдб рд╣реЛрдЧрд╛, рдФрд░ "рдмрд╣реБрдд рдХреБрдЫ" - рд╕рднреА 60. рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдЕрдкрдиреЗ рдореБрдЦреНрдп рд▓реВрдк рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗред рд▓реЗрдХрд┐рди рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдПрдХ рдХреАрд╕реНрдЯреНрд░реЛрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рд╕реАрдзреЗ av_seek_frame рдирд╣реАрдВ рдХрд╣ рд╕рдХрддреЗ ред рдпрд╣ рд╣рдорд╛рд░реЗ рдореБрдЦреНрдп рдбрд┐рдХреЛрдбрд┐рдВрдЧ рд▓реВрдк, рдбрд┐рдХреЛрдб_рдереНрд░реЗрдб рд▓реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рд▓рд┐рдП, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдореБрдЦреНрдп рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреБрдЫ рдорд╛рди рдЬреЛрдбрд╝реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЦреЛрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╕реНрдерд╛рди рдФрд░ рдХреБрдЫ рдЦреЛрдЬ рдзреНрд╡рдЬ рд╣реЛрдВрдЧреЗ: int seek_req;
int seek_flags;
int64_t seek_pos;
рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рдореБрдЦреНрдп рд▓реВрдк рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХрд┐рд╕реНрдЯреНрд░реЛрдХреНрд╕ рдХреЛ рдкрдХрдбрд╝рддрд╛ рд╣реИ: for(;;) {
double incr, pos;
SDL_WaitEvent(&event);
switch(event.type) {
case SDL_KEYDOWN:
switch(event.key.keysym.sym) {
case SDLK_LEFT:
incr = -10.0;
goto do_seek;
case SDLK_RIGHT:
incr = 10.0;
goto do_seek;
case SDLK_UP:
incr = 60.0;
goto do_seek;
case SDLK_DOWN:
incr = -60.0;
goto do_seek;
do_seek:
if(global_video_state) {
pos = get_master_clock(global_video_state);
pos += incr;
stream_seek(global_video_state,
(int64_t)(pos * AV_TIME_BASE), incr);
}
break;
default:
break;
}
break;
рдХреАрд╕реНрдЯреНрд░реЛрдХ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓реЗ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреНрдпрд╛ SDL_KEYDOWN рдИрд╡реЗрдВрдЯ рд╣реБрдЖ ред рддрдм рд╣рдо check.key.keysym.sym рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреМрди рд╕реА рдХреБрдВрдЬреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ ред рдЬреИрд╕реЗ рд╣реА рд╣рдореЗрдВ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдХрд┐ рд╣рдо рдХрд┐рд╕ рджрд┐рд╢рд╛ рдореЗрдВ рджреЗрдЦ рд░рд╣реЗ рд╣реИрдВ, рд╣рдо рдПрдХ рдирдП рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдирдП get_master_clock рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдореВрд▓реНрдп рдореЗрдВ рд╡реГрджреНрдзрд┐ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ ред рддрдм рд╣рдо seek_pos рдорд╛рдиреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП stream_seek рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддреЗ рд╣реИрдВ , рдЖрджрд┐ред рд╣рдорд╛рд░реЗ рдирдП рд╕рдордп рдХреЛ рдЖрдВрддрд░рд┐рдХ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдВ ред рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдлреНрд░реЗрдо рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд╕реЗрдХрдВрдб рдореЗрдВ рдирд╣реАрдВ, рдирд┐рдореНрди рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ: рд╕реЗрдХрдВрдб = рдлреНрд░реЗрдо * time_base ( рдПрдлрдкреАрдПрд╕ )редрдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдПрд╡реЛрдбреЗрдХ рдХреЛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 1,000,000 рдлреНрд░реЗрдо рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП 2 рд╕реЗрдХрдВрдб рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ 2,000,000 рдХрд╛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╣реЛрдЧрд╛)ред рд╣рдореЗрдВ рдЗрд╕ рдорд╛рди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреНрдпреЛрдВ рд╣реИ - рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВредрдпрд╣рд╛рдВ рд╣рдорд╛рд░рд╛ рд╕реНрдЯреНрд░реАрдо_рд╕реЗрдХ рдлрд╝рдВрдХреНрд╢рди рд╣реИ ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рд╣рдо рдкреАрдЫреЗ рдЬрд╛рддреЗ рд╣реИрдВ рддреЛ рд╣рдо рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ:void stream_seek(VideoState *is, int64_t pos, int rel) {
if(!is->seek_req) {
is->seek_pos = pos;
is->seek_flags = rel < 0 ? AVSEEK_FLAG_BACKWARD : 0;
is->seek_req = 1;
}
}
рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдбрд┐рдХреЛрдб_рдереНрд░реЗрдб рдкрд░ рдЪрд▓рддреЗ рд╣реИрдВ , рдЬрд╣рд╛рдБ рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВред рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдордиреЗ "рдЦреЛрдЬ рдЬрд╛рд░реА рд╣реИ" рдХреНрд╖реЗрддреНрд░ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдареАрдХ рд╣реИ, рд╣рдо рдЗрд╕реЗ рдЕрднреА рд╡рд╣рд╛рдВ рд▓рдЧрд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВредрдЦреЛрдЬ av_seek_frame рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдЖрд╕рдкрд╛рд╕ рдХреЗрдВрджреНрд░рд┐рдд рд╣реИ ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рдВрджрд░реНрдн, рд╕реНрдЯреНрд░реАрдо, рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдФрд░ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддрд╛ рд╣реИред рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рджрд┐рдП рдЧрдП рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рд▓рд┐рдП рджрд┐рдЦреЗрдЧрд╛ред рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреА рдЗрдХрд╛рдИ рд╕реНрдЯреНрд░реАрдо рдХрд╛ time_base рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдорд╛рди -1 рдкрд╛рд╕ рдХрд░рдХреЗ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред рдпрджрд┐ рдЖрдк рдРрд╕рд╛ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ time_base avcodec рдЖрдВрддрд░рд┐рдХ рд╕рдордп рдЗрдХрд╛рдИ рдореЗрдВ рд╣реЛрдЧрд╛рдпрд╛ 1000000 рдПрдлрдкреАрдПрд╕ред рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╣рдо рд╕реЗ рд╣рдорд╛рд░реА рд╕реНрдерд┐рддрд┐ рдЧреБрдгрд╛ рд╣реИ AV_TIME_BASE рдЬрдм рд╣рдо рд╕реЗрдЯ seek_pos редрд╣рд╛рд▓рд╛рдБрдХрд┐, рдХрднреА-рдХрднреА рдЖрдк (рд╢рд╛рдпрдж рд╣реА рдХрднреА) рдХреБрдЫ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд╕реНрдпрд╛рдУрдВ рдореЗрдВ рднрд╛рдЧ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рдЖрдк рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП av_seek_frame - 1 рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЕрдкрдиреА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдкрд╣рд▓реА рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ av_seek_frame рдХреЛ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗ ред рдпрд╣ рдордд рднреВрд▓реЛ рдХрд┐ рдирдП "рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА" рдореЗрдВ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЕрдкрдиреЗ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЗ рдкреИрдорд╛рдиреЗ рдХреЛ рдмрджрд▓рдирд╛ рд╣реЛрдЧрд╛редif(is->seek_req) {
int stream_index= -1;
int64_t seek_target = is->seek_pos;
if (is->videoStream >= 0) stream_index = is->videoStream;
else if(is->audioStream >= 0) stream_index = is->audioStream;
if(stream_index>=0){
seek_target= av_rescale_q(seek_target, AV_TIME_BASE_Q,
pFormatCtx->streams[stream_index]->time_base);
}
if(av_seek_frame(is->pFormatCtx, stream_index,
seek_target, is->seek_flags) < 0) {
fprintf(stderr, "%s: error while seeking\n",
is->pFormatCtx->filename);
} else {
av_rescale_q ( a , b , c ) рдПрдХ рдРрд╕рд╛ рдХрд╛рд░реНрдп рд╣реИ рдЬреЛ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ рдПрдХ рдЖрдзрд╛рд░ рд╕реЗ рджреВрд╕рд░реЗ рдЖрдзрд╛рд░ рдкрд░ рдорд╛рдкрддрд╛ рд╣реИред рдпрд╣ рдореВрд▓ рд░реВрдк рд╕реЗ рдПрдХ * b / c рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ , рд▓реЗрдХрд┐рди рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд╛рдо рдореЗрдВ рдЖрддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЧрдгрдирд╛ рдХрднреА-рдХрднреА рдЕрддрд┐рдкреНрд░рд╡рд╛рд╣ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреА рд╣реИред AV_TIME_BASE_Q рдХреА рдПрдХ рдЖрдВрд╢рд┐рдХ рд╕рдВрд╕реНрдХрд░рдг рд╣реИ AV_TIME_BASE ред рд╡реЗ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд▓рдЧ рд╣реИрдВ: AV_TIME_BASE * time_in_seconds = avcodec_timestamp рдФрд░ AV_TIME_BASE_Q * avcodec_timestamp = time_in_seconds (рд▓реЗрдХрд┐рди рдЙрд╕ AV_TIME_BASE_Qрд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ AVRational рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ , рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП avcodec рдореЗрдВ рд╡рд┐рд╢реЗрд╖ q рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ)редрдмрдлрд░ рд╕рдлрд╛рдИ
рдЗрд╕рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреА рдЦреЛрдЬреЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рддрдХ рд╕рдорд╛рдкреНрдд рдирд╣реАрдВ рд╣реБрдП рд╣реИрдВред рдпрд╛рдж рд░рдЦреЗрдВ, рдХреНрдпрд╛ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкреИрдХреЗрдЯ рд╕рдВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрддрд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рд╣реИ? рдЕрдм рдЬрдм рд╣рдо рдПрдХ рдЕрд▓рдЧ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдореЗрдВ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдЗрд╕ рдХрддрд╛рд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдореВрд╡реА рдореЗрдВ рдЦреЛрдЬ рдирд╣реАрдВ рдЪрд▓реЗрдЧреА! рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрд╡реЛрдбреЗрдХ рдХреЗ рдкрд╛рд╕ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрдВрддрд░рд┐рдХ рдмрдлрд╝рд░ рд╣реИрдВ, рдЬрд┐рдиреНрд╣реЗрдВ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдлреНрд▓рд╢ рдХрд░рдиреЗ рдХреА рднреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рд╣рдорд╛рд░реЗ рдкреИрдХреЗрдЯ рдХрддрд╛рд░ рдХреЛ рд╕рд╛рдлрд╝ рдХрд░рддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдкрдХреЛ рдХрд┐рд╕реА рддрд░рд╣ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЛ рдирд┐рд░реНрджреЗрд╢ рджреЗрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрд╡реЙрдбреЗрдХ рдЖрдВрддрд░рд┐рдХ рдмрдлрд╝рд░реНрд╕ рдХреЛ рд╕рд╛рдлрд╝ рдХрд┐рдпрд╛ рд╣реИ ред рд╣рдо рдЗрд╕реЗ рд╕рд╛рдл рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрдХреЗрдЯ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦ рдХрд░ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЬрдм рд╡реЗ (рдзрд╛рдЧреЗ) рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рдкреИрдХреЗрдЯ рдХреА рдЦреЛрдЬ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╡реЗ рдЕрдкрдиреЗ рдмрдлрд╝рд░реНрд╕ рдХреЛ рд╕рд╛рдл рдХрд░ рджреЗрдВрдЧреЗредрдЪрд▓реЛ рд░реАрд╕реЗрдЯ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдлреА рд╕рд░рд▓ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреЛрдб рджрд┐рдЦрд╛рдКрдВрдЧрд╛: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->nb_packets = 0;
q->size = 0;
SDL_UnlockMutex(q->mutex);
}
рдЕрдм рдЬрдм рдХрддрд╛рд░ рд╕рд╛рдл рд╣реЛ рдЧрдИ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ "рдХреНрд▓реАрдВрдЬрд┐рдВрдЧ рдкреИрдХреЗрдЯ" рдХреЛ рдЬреЛрдбрд╝реЗрдВред рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ, рдпрд╣ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрдирд╛рдПрдВ:AVPacket flush_pkt;
main() {
...
av_init_packet(&flush_pkt);
flush_pkt.data = "FLUSH";
...
}
рдЕрдм рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рд░рдЦреЗрдВ: } else {
if(is->audioStream >= 0) {
packet_queue_flush(&is->audioq);
packet_queue_put(&is->audioq, &flush_pkt);
}
if(is->videoStream >= 0) {
packet_queue_flush(&is->videoq);
packet_queue_put(&is->videoq, &flush_pkt);
}
}
is->seek_req = 0;
}
(рдпрд╣ рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ decode_thread рдХреЗ рд▓рд┐рдП рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдХреЛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИ ред) рд╣рдореЗрдВ рднреА packet_queue_put рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рд╕рдлрд╛рдИ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрдХреЗрдЬ рдХреА рдирдХрд▓ рди рдХрд░реЗрдВ:int packet_queue_put(PacketQueue *q, AVPacket *pkt) {
AVPacketList *pkt1;
if(pkt != &flush_pkt && av_dup_packet(pkt) < 0) {
return -1;
}
рдФрд░ рдлрд┐рд░ рдСрдбрд┐рдпреЛ рдФрд░ рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рд╣рдордиреЗ рдЗрд╕ рдХреЙрд▓ рдХреЛ packet_queue_get рдХреЗ рдареАрдХ рдмрд╛рдж avcodec_flush_buffers рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ : if(packet_queue_get(&is->audioq, pkt, 1) < 0) {
return -1;
}
if(pkt->data == flush_pkt.data) {
avcodec_flush_buffers(is->audio_st->codec);
continue;
}
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ "рд╡реАрдбрд┐рдпреЛ" рджреНрд╡рд╛рд░рд╛ "рдСрдбрд┐рдпреЛ" рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рдХреЗ рд╕рд╛рде, рд╡реАрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЗ рд▓рд┐рдП рдмрд┐рд▓реНрдХреБрд▓ рд╕рдорд╛рди рд╣реИредрдпрд╣ рдмрд╛рдд рд╣реИ! рд╣рдордиреЗ рдХрд░ рджрд┐рдпрд╛! рдЕрдкрдиреЗ рдЦрд┐рд▓рд╛рдбрд╝реА рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:gcc -o tutorial07 tutorial07.c -lavutil -lavformat -lavcodec -lswscale -lz -lm \
`sdl-config --cflags --libs`
рдФрд░ рд╕реА рдХреЗ 1000 рд╕реЗ рдХрдо рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдХрд┐рдП рдЧрдП рдЕрдкрдиреЗ рдореВрд╡реА рдкреНрд▓реЗрдпрд░ рдХрд╛ рдЖрдирдВрдж рд▓реЗрдВ!рд╣рд╛рд▓рд╛рдВрдХрд┐, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдмрд╣реБрдд рд╕реА рдЪреАрдЬреЗрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЬреЛрдбрд╝рд╛ рдпрд╛ рд╕реБрдзрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдЕрдВрддрднрд╛рд╖рдг тЖР тЗС тЖТ
рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдПрдХ рдХрд╛рдо рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рдорд┐рд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдЙрддрдирд╛ рдЕрдЪреНрдЫрд╛ рдирд╣реАрдВ рд╣реИ рдЬрд┐рддрдирд╛ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдмрд╣реБрдд рд╕реА рдЙрдкрдпреЛрдЧреА рдЪреАрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реЛрдЧрд╛:- рдЗрд╕рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдпрд╣ рдЦрд┐рд▓рд╛рдбрд╝реА рдмреЗрдХрд╛рд░ рд╣реИред Ffplay.c рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг, рдЬрд┐рд╕ рдкрд░ рдпрд╣ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк FFmpeg рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдзрд┐рдХ рдЧрдВрднреАрд░ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ рдЕрдиреБрд╢рдВрд╕рд╛ рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдк рдЕрдЧрд▓реЗ рдХрд╛рд░реНрдп рдХреЗ рд░реВрдк рдореЗрдВ ffplay.c рдХреЗ рдирд╡реАрдирддрдо рд╕рдВрд╕реНрдХрд░рдг рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВред
- рд╣рдорд╛рд░реЗ рдХреЛрдб рдореЗрдВ рддреНрд░реБрдЯрд┐ рд╣реИрдВрдбрд▓рд┐рдВрдЧ рднрдпрд╛рдирдХ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
- , , , . , paused , , . , , . av_read_play. - , . , , . : , ffplay.c.
- .
- . , , , , VOB-.
- . , .
- . .
- , , , , YUV, time_base.
- .
- --, ; ffplay.c .
рдпрджрд┐ рдЖрдк FFmpeg рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣рд╛рдВ рд╣рдордиреЗ рд╣рд░ рдЪреАрдЬ рд╕реЗ рджреВрд░ рдорд╛рдирд╛ рд╣реИред рдЕрдЧрд▓рд╛ рдЪрд░рдг рдорд▓реНрдЯреАрдореАрдбрд┐рдпрд╛ рдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рдирд╛ рд╣реИред рдлрд╝рд╛рдЗрд▓ output_example.c рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ , рдЬреЛ рдЖрдкрдХреЛ FFmpeg рд╡рд┐рддрд░рдг рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ред рдореИрдВ рдЗрд╕ рд╡рд┐рд╖рдп рдкрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдПрдХ рдФрд░ рдкрд╛рдареНрдпрдкреБрд╕реНрддрдХ рд▓рд┐рдЦ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рдкрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИредрдпреБрдкреАрдбреАредрдмрд╣реБрдд рд╕рдордп рдкрд╣рд▓реЗ рдореИрдВрдиреЗ рдЗрд╕ рдкрд╛рда рдХреЛ рдЕрдкрдбреЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдмреАрдЪ рджреБрдирд┐рдпрд╛ рдЕрднреА рднреА рд╕реНрдерд┐рд░ рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдХреЗрд╡рд▓ рд╕рд░рд▓ рдПрдкреАрдЖрдИ рдЕрдкрдбреЗрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ; рдмреБрдирд┐рдпрд╛рджреА рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдмрд╣реБрдд рдХрдо рдмрджрд▓ рдЧрдпрд╛ рд╣реИред рдЗрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдЕрдкрдбреЗрдЯ рдиреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреЛрдб рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдпрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рд╛рд▓рд╛рдБрдХрд┐ рдореИрдВрдиреЗ рдкреВрд░реЗ рдХреЛрдб рдкрд░ рдЪрд▓рдХрд░ рдЗрд╕реЗ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди FFplay рдЕрднреА рднреА рдЗрд╕ рдЦрд┐рд▓реМрдирд╛ рдЦрд┐рд▓рд╛рдбрд╝реА рд╕реЗ рдмреЗрд╣рддрд░ рд╣реИред рджрд┐рд▓ рдкрд░ рд╣рд╛рде рд░рдЦрдХрд░, рд╣рдо рдорд╛рдирддреЗ рд╣реИрдВ: рдЗрди рдкрд╛рдареЛрдВ рдореЗрдВ рд╣рдордиреЗ рдПрдХ рдмрд╣реБрдд рд╣реА рдШрдЯрд┐рдпрд╛ рдлрд┐рд▓реНрдо рдЦрд┐рд▓рд╛рдбрд╝реА рд▓рд┐рдЦрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдЬ (рдпрд╛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ) рдЖрдк рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдореЗрд░рд╛ рд╕реБрдЭрд╛рд╡ рд╣реИ рдХрд┐ рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ FFplay рдХреЗ рд╕рд╛рде рдкрд░рд┐рдЪрд┐рдд рдХрд░реЗрдВ рдФрд░ рдкрддрд╛ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рдЧрд╛рдпрдм рд╣реИред рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдпрд╣ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рд╡реАрдбрд┐рдпреЛ рдЙрдкрдХрд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЪрд┐рдВрддрд╛ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рд╕рдВрднрд╡рддрдГ, рдореБрдЭреЗ рдХреБрдЫ рдЕрдиреНрдп рд╕реНрдкрд╖реНрдЯ рдЪреАрдЬреЗрдВ рдпрд╛рдж рдЖ рд░рд╣реА рд╣реИрдВред рд╢рд╛рдпрдж рдореМрдЬреВрджрд╛ рдПрдлрдПрдлрдкреНрд▓реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рд╕реЗ рдХреБрдЫ рдЪреАрдЬреЛрдВ рдХрд╛ рдПрдХ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ - рдореИрдВрдиреЗ рдЗрд╕реЗ рдЕрднреА рддрдХ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИредрд▓реЗрдХрд┐рди рдореБрдЭреЗ рдмрд╣реБрдд рдЧрд░реНрд╡ рд╣реИ рдХрд┐ рдЗрди рд╡рд░реНрд╖реЛрдВ рдореЗрдВ рдореЗрд░реЗ рдХрд╛рдо рдиреЗ рдмрд╣реБрдд рдорджрдж рдХреА рд╣реИ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рддрдереНрдп рдХреЛ рднреА рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рдХрд┐ рд▓реЛрдЧ рдЕрдХреНрд╕рд░ рдХрд╣реАрдВ рдФрд░ рдХреЛрдб рдЦреЛрдЬрддреЗ рдереЗред рдореИрдВ рдЪреЗрд▓рд┐рдпрд╛рд╡реА рдХрд╛ рдмрд╣реБрдд рдЖрднрд╛рд░реА рд╣реВрдВ , рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдЦреБрдж рдХреЛ рдЙрди рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреА рдЬрдЧрд╣ рд▓реЗрдиреЗ рдХреА рджрд┐рдирдЪрд░реНрдпрд╛ рджреА рд╣реИ рдЬреЛ рдореИрдВрдиреЗ рдЗрд╕ рдореЛрдиреЛрдЧреНрд░рд╛рдл 8 (!) рд╕рд╛рд▓реЛрдВ рдкрд╣рд▓реЗ рд▓рд┐рдЦреЗ рдереЗредрдореИрдВ рдЗрд╕ рдЙрдореНрдореАрдж рдореЗрдВ рдЦреБрд╢ рд╣реВрдВ рдХрд┐ рдпреЗ рд╕рдмрдХ рдЙрдкрдпреЛрдЧреА рдирд╣реАрдВ рдереЗ рдФрд░ рдЙрдмрд╛рдК рдирд╣реАрдВ рдереЗред рдпрджрд┐ рдЗрд╕ рдЧрд╛рдЗрдб рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рдХреЛрдИ рд╕реБрдЭрд╛рд╡, рддреНрд░реБрдЯрд┐рдпрд╛рдВ, рд╢рд┐рдХрд╛рдпрддреЗрдВ, рдзрдиреНрдпрд╡рд╛рдж рдЖрджрд┐ рд╣реИрдВ, рддреЛ рдХреГрдкрдпрд╛ рдореБрдЭреЗ рдбреЙрдЧрд░ рдбреЙрдЧ рдЬреАрдореЗрд▓ рдбреЙрдЯ рдХреЙрдо рдкрд░ рд▓рд┐рдЦреЗрдВред рдФрд░ рд╣рд╛рдБ, рдпрд╣ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ рдореБрдЭреЗ рдЕрдкрдиреЗ FFmpeg рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд╕рд╛рде рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ред рдЗрд╕реА рддрд░рд╣ рдХреЗ рдмрд╣реБрдд рд╕реЗ рдкрддреНрд░ рд╣реИрдВ ред
рдкрд░рд┐рд╢рд┐рд╖реНрдЯ 1. рдХрд╛рд░реНрдпреЛрдВ рдХреА рд╕реВрдЪреА тЖР тЗС тЖТ
int avformat_open_input(AVFormatContext **ptr, const char * filename, AVInputFormat *fmt, AVDictionary **options)
рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдирд╛рдо рдЦреЛрд▓рддрд╛ рд╣реИ, ptr рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдкрддреЗ рдореЗрдВ рдкреНрд░рд╛рд░реВрдк рд╕рдВрджрд░реНрдн рдмрдЪрд╛рддрд╛ рд╣реИ редfmt : рдпрджрд┐ NULL рдирд╣реАрдВ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдлреЙрд░реНрдореЗрдЯ рд╕реЗрдЯ рдХрд░реЗрдВредbuf_size : рдмрдлрд░ рдЖрдХрд╛рд░ (рд╡реИрдХрд▓реНрдкрд┐рдХ)редрд╡рд┐рдХрд▓реНрдк : AV рдврд╛рдБрдЪрд╛ AVFormatContext рдФрд░ demultiplexer рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдЖрдмрд╛рдж рд╣реИ редvoid avformat_close_input(AVFormatContext **s)
рдореАрдбрд┐рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдмрдВрдж рдХрд░рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣ рдХреЛрдбреЗрдХреНрд╕ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИредnt avio_open2 (AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options)
Url
рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП I / O рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИ редs : AVIOContext рдХреЛ рдЙрд╕ рдЬрдЧрд╣ рдкрд░ рдкреЙрдЗрдВрдЯрд░ рдмрдирд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ ред рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдорд╛рди NULL рдкрд░ рд╕реЗрдЯ рд╣реИредurl : рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕рд╛рдзрди рдХрд╛ рдирд╛рдоредрдЭрдВрдбреЗ : рдпреВрдЖрд░рдПрд▓ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕рд╛рдзрди рдХреЗ рдЙрджреНрдШрд╛рдЯрди рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ редint_cb : рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕реНрддрд░ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдмрд╛рдзрд┐рддредрд╡рд┐рдХрд▓реНрдк : рдирд┐рдЬреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдмрд╛рдж рдПрдХ рд╢рдмреНрджрдХреЛрд╢ред рдЬрдм рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрддрд╛ рд╣реИ, рддреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдирд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рд╣реБрдХ рдпреБрдХреНрдд рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдирд╣реАрдВ рдкрд╛рдП рдЧрдП рдереЗред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ NULL рд╣реЛредint av_dup_packet(AVPacket *pkt)
рдмреЗрд╢рдХ, рдпрд╣ рдПрдХ рд╣реИрдХ рд╣реИ: рдпрджрд┐ рдпрд╣ рдкреИрдХреЗрдЬ рдЖрд╡рдВрдЯрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рдпрд╣рд╛рдВ рдкреЛрд╕реНрдЯ рдХрд░рддреЗ рд╣реИрдВред рд╕рдлрд▓рддрд╛ рдкрд░ 0 рдпрд╛ рд╡рд┐рдлрд▓рддрд╛ рдкрд░ AVERROR_NOMEM рджреЗрддрд╛ рд╣реИредint av_find_stream_info(AVFormatContext *s, AVDictionary **options)
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЧреИрд░-рд╕реНрдкрд╖реНрдЯ рд╕реНрдЯреНрд░реАрдо рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдлреНрд░реЗрдо рджрд░ред рдпрд╣ рд╣реЗрдбрд░ рд░рд╣рд┐рдд рдлрд╝рд╛рдЗрд▓ рд╕реНрд╡рд░реВрдкреЛрдВ рдЬреИрд╕реЗ рдПрдордкреАрдИрдЬреА рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИред рд░рд┐рдЯрд░реНрди> = 0 рдпрджрд┐ рд╕рдлрд▓ рд╣реЛ, рддреНрд░реБрдЯрд┐ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ AVERROR_ *редAVFrame *avcodec_free_frame()
Av_frame_free рдХрд╛ рдкреБрд░рд╛рдирд╛ рдирд╛рдоред 55.28.1 lavc рдореЗрдВ рдмрджрд▓рд╛редvoid av_frame_free (AVFrame **frame)
рдЗрд╕рдореЗрдВ рдПрдХ рдлреНрд░реЗрдо рдФрд░ рдХрд┐рд╕реА рднреА рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдЖрд╡рдВрдЯрд┐рдд рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЬрд╛рд░реА рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, Extended_dataредvoid av_free(void *ptr)
Av_malloc () рдпрд╛ av_realloc () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдмрдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ ptr == NULL рдХреЗ рд╕рд╛рде рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕рдХреЗ рдмрдЬрд╛рдп av_freep () рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВредvoid av_freep(void *ptr)
рдореЗрдореЛрд░реА рдХреЛ рдлреНрд░реАрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреЙрдЗрдВрдЯрд░ рдХреЛ NULL рдореЗрдВ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ av_free () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредvoid av_free_packet(AVPacket *pkt)
рдкреИрдХреЗрдЬ рд╡рд┐рдирд╛рд╢ рд╡рд┐рдзрд┐ (pkt-> рд╡рд┐рдирд╛рд╢) рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рд▓рдкреЗрдЯреЗрдВредint64_t av_gettime()
рдорд╛рдЗрдХреНрд░реЛрд╕реЗрдХрдВрдб рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕рдордп рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВредvoid av_init_packet(AVPacket *pkt)
рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреИрдХреЗрдЬ рдлрд╝реАрд▓реНрдб рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛редvoid *av_malloc(unsigned int size)
рд╕реНрдореГрддрд┐ рдЖрд╡рдВрдЯрди рдмрд╛рдЗрдЯ рдЖрдХрд╛рд░ рд╕рдВрд░реЗрдЦрдг рдХреЗ рд╕рд╛рде рд╕рднреА рдореЗрдореЛрд░реА рдПрдХреНрд╕реЗрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИ (рд╡реИрдХреНрдЯрд░ рд╕рд╣рд┐рдд, рдпрджрд┐ рд╕реАрдкреАрдпреВ рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ)ред av_malloc (0) рдХреЛ рдПрдХ рдЧреИрд░-рд╢реВрдиреНрдп рд╕реВрдЪрдХ рд▓реМрдЯрдирд╛ рдЪрд╛рд╣рд┐рдПредvoid *av_mallocz(unsigned int size)
Av_malloc () рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдорд╛рди рд╣реИ, рд▓реЗрдХрд┐рди рд╕реНрдореГрддрд┐ рдХреЛ рд╢реВрдиреНрдп рд╕реЗ рдЖрд░рдВрдн рдХрд░рддрд╛ рд╣реИредdouble av_q2d(AVRational a)
рджреЛрд╣рд░реАрдХрд░рдгредint av_read_frame(AVFormatContext *s, AVPacket *pkt)
рдЕрдЧрд▓реА рд╕реНрдЯреНрд░реАрдо рдлрд╝реНрд░реЗрдо рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реВрдЪрдирд╛ рдХреЛ pkt рдореЗрдВ рдПрдХ рдкреИрдХреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрд▓реМрдЯрд╛ рдкреИрдХреЗрдЬ рдЕрдЧрд▓реЗ av_read_frame () рддрдХ рдпрд╛ av_close_input_file () рддрдХ рдорд╛рдиреНрдп рд╣реИ рдФрд░ av_free_packet рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рд╡реАрдбрд┐рдпреЛ рдкреИрдХреЗрдЬ рдореЗрдВ рдареАрдХ рдПрдХ рдлреНрд░реЗрдо рд╣реЛрддрд╛ рд╣реИред рдСрдбрд┐рдпреЛ рдХреЗ рд▓рд┐рдП, рдЗрд╕рдореЗрдВ рдПрдХ рдкреВрд░реНрдгрд╛рдВрдХ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╝реНрд░реЗрдо рд╣реЛрддреЗ рд╣реИрдВ рдпрджрд┐ рдкреНрд░рддреНрдпреЗрдХ рдлрд╝реНрд░реЗрдо рдореЗрдВ рдПрдХ рдЬреНрдЮрд╛рдд рдирд┐рд╢реНрдЪрд┐рдд рдЖрдХрд╛рд░ рд╣реЛрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреАрд╕реАрдПрдо рдпрд╛ рдПрдбреАрдкреАрд╕реАрдПрдо рдбреЗрдЯрд╛)ред рдпрджрд┐ рдСрдбрд┐рдпреЛ рдлрд╝реНрд░реЗрдо рдЪрд░ рдЖрдХрд╛рд░ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдордкреАрдИрдЬреА рдСрдбрд┐рдпреЛ) рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕рдореЗрдВ рдПрдХ рдлреНрд░реЗрдо рд╣реЛрддрд╛ рд╣реИредpkt-> pts, pkt-> dts рдФрд░ pkt-> рдЕрд╡рдзрд┐ рд╣рдореЗрд╢рд╛ AVStream.timebase рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рд╕рд╣реА рдорд╛рди рдкрд░ рд╕реЗрдЯ рд╣реЛрддреА рд╣реИ (рдФрд░ рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рд╛рд░реВрдк рдЙрдиреНрд╣реЗрдВ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ)ред pkt-> pts AV_NOPTS_VALUE рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдпрджрд┐ рд╡реАрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ B рдлрд╝реНрд░реЗрдо рд╣реИрдВ, рддреЛ рдпрджрд┐ рдЖрдк рдкреЗрд▓реЛрдб рдХреЛ рдЕрдирдкреИрдХ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ pkt-> dts рдкрд░ рднрд░реЛрд╕рд╛ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИредрд▓реМрдЯрд╛ рдкрд░рд┐рдгрд╛рдо: 0, рдЕрдЧрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реИ, <0, рдЕрдЧрд░ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реИ рдпрд╛ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЕрдВрдд рд╣реИредvoid av_register_all();
рдкреБрд╕реНрддрдХрд╛рд▓рдп рдореЗрдВ рд╕рднреА рдХреЛрдбрдХ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИредint64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
рдПрдХ * bq / cq
рд▓реМрдЯрд╛рддрд╛ рд╣реИ редint av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp, int flags)
рдПрдХ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдкрд░ рдПрдХ рдХреБрдВрдЬреАрдлреНрд░реЗрдо рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИредstream_index : рдЕрдЧрд░ stream_index -1 рд╣реИ, рддреЛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрдЯреНрд░реАрдо рдЪрдпрдирд┐рдд рд╣реИ рдФрд░ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ AV_TIME_BASE рдЗрдХрд╛рдЗрдпреЛрдВ рд╕реЗ рд╕реНрдЯреНрд░реАрдо-рд╡рд┐рд╢рд┐рд╖реНрдЯ time_base рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредрдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк : рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреЛ AVStream.time_base рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдХреЛрдИ рд╕реНрдЯреНрд░реАрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ AV_TIME_BASE рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВредрдЭрдВрдбреЗ : рджрд┐рд╢рд╛ рдФрд░ рдЦреЛрдЬ рдореЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:AVSEEK_FLAG_ANY: рдХрд┐рд╕реА рднреА рдлреНрд░реЗрдо рдореЗрдВ рдЦреЛрдЬреЗрдВ, рди рдХрд┐ рдХреЗрд╡рд▓ рдХреБрдВрдЬреАредAVSEEK_FLAG_BACKWARD: рд╡рд┐рдкрд░реАрдд рджрд┐рд╢рд╛ рдореЗрдВ рдЦреЛрдЬреЗрдВредAVSEEK_FLAG_BYTE: рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдерд┐рддрд┐ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЦреЛрдЬреЗрдВредAVFrame *avcodec_alloc_frame()
Av_frame_alloc рдХрд╛ рдкреБрд░рд╛рдирд╛ рдирд╛рдоред 55.28.1 lavc рдореЗрдВ рдмрджрд▓рд╛редAVFrame *av_frame_alloc()
рдПрдХ AVFrame рдХрд╛ рдЪрдпрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИред Av_frame_free () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредint avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, const AVPacket *avpkt)
рдПрдХ рдСрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдХреЛ рдЕрд╡рд╛рдкреНрдХреЗрдЯ рд╕реЗ рдлреНрд░реЗрдо рддрдХ рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИред Avcodec_decode_audio4 () рдлрд╝рдВрдХреНрд╢рди AVPacket рд╕реЗ рдПрдХ рдСрдбрд┐рдпреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдбреАрдХреЛрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдПрдХ рдСрдбрд┐рдпреЛ рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ avcodec_open2 () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ avctx рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдореА рдбрд┐рдХреЛрдб рдХрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ AVFrame рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рдлрд╝реНрд░реЗрдо рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдпрд╣ get_frame_ptr рдХреЛ 1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдЧрд╛редрдЪреЗрддрд╛рд╡рдиреА: рдЗрдирдкреБрдЯ рдмрдлрд╝рд░, avpkt-> рдбреЗрдЯрд╛, FF_INPUT_BUFFER_PADDING_SIZE рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реАрдб рдмрд╛рдЗрдЯреНрд╕ рд╕реЗ рдмрдбрд╝рд╛ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдХреБрдЫ рдЕрдиреБрдХреВрд▓рд┐рдд рдмрд┐рдЯрд╕реНрдЯреНрд░реАрдо рдкрд╛рдардХ рдПрдХ рд╕рдордп рдореЗрдВ 32 рдпрд╛ 64 рдмрд┐рдЯреНрд╕ рдкрдврд╝рддреЗ рд╣реИрдВ рдФрд░ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдорд╛рдкреНрддредavctx : рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрднредрдлреНрд░реЗрдо : рд▓рдХреНрд╖реНрдп рдлреНрд░реЗрдоредgot_frame_ptr : рд▓рдХреНрд╖реНрдп int, рдЬреЛ рдЕрдЧрд░ рдлреНрд░реЗрдо рдЕрдирдкреИрдХ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редAVPKT: AVPacket рдпреБрдХреНрдд рдСрдбрд┐рдпреЛредрд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкрд░рд┐рдгрд╛рдо: рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд▓реМрдЯрд╛ рджреА рдЬрд╛рддреА рд╣реИ, рддреЛ рдПрдХ рдЛрдгрд╛рддреНрдордХ рдорд╛рди рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛, рдЗрдирдкреБрдЯ AVPacket рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреА рд╣реИредint avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *frameFinished, const AVPacket *avpkt)
рдмрдлрд╝ рд╕реЗ рдПрдХ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реАрдбрд┐рдпреЛ рдлреНрд░реЗрдо рдбрд┐рдХреЛрдб рдХрд░рддрд╛ рд╣реИред Avcodec_decode_video2 () рдлрд╝рдВрдХреНрд╢рди buf_size рдХреЗ рдЗрдирдкреБрдЯ рдмрдлрд╝рд░ рд╕реЗ рдПрдХ рд╡реАрдбрд┐рдпреЛ рдлрд╝реНрд░реЗрдо рдХреЛ рдбреАрдХреЛрдб рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП, рдПрдХ рд╡реАрдбрд┐рдпреЛ рдХреЛрдбреЗрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ avcodec_open2 () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ avctx рд╕реЗ рдЬреБрдбрд╝рд╛ рдерд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рдлреНрд░реЗрдо рдЪрд┐рддреНрд░ рдореЗрдВ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИредрдЪреЗрддрд╛рд╡рдиреА: рд╕рдВрд░реЗрдЦрдг рдЙрджрд╛рд╣рд░рдг рдФрд░ рдмрдлрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдЬреЛ avcodec_decode_audio4 рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВ рдФрд░ рд╕рд╛рде рд╣реА рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рднреА рд▓рд╛рдЧреВ рд╣реЛрддреА рд╣реИрдВредavctx : рдХреЛрдбреЗрдХ рд╕рдВрджрд░реНрднредрдЪрд┐рддреНрд░ : AVFrame рдЬрд┐рд╕рдореЗрдВ рдбрд┐рдХреЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╡реАрдбрд┐рдпреЛ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдПрдЧрд╛редрдлреНрд░реЗрдордлрд┐рдирд┐рд╢ : рд╢реВрдиреНрдп рдпрджрд┐ рдХреЛрдИ рдлреНрд░реЗрдо рдЕрдирдкреИрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдпрд╣ рд╢реВрдиреНрдп рдХреЗ рдмрд░рд╛рдмрд░ рдирд╣реАрдВ рд╣реИредavpkt: рдЗрдирдкреБрдЯ рдПрд╡реАрдкреИрдХреЗрдЯ рдЬрд┐рд╕рдореЗрдВ рдЗрдирдкреБрдЯ рдмрдлрд░ рд╣реИред рдЖрдк av_init_packet () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕ рддрд░рд╣ рдХрд╛ рдкреИрдХреЗрдЬ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдлрд┐рд░, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдбреЗрдЯрд╛ рдФрд░ рдЖрдХрд╛рд░ рд╣реЛрдиреЗ рдкрд░, рдХреБрдЫ рдбрд┐рдХреЛрдбрд░реЛрдВ рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рд░реВрдк рд╕реЗ рдЕрдиреНрдп рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЭрдВрдбреЗ рдФрд░ AV_PKT_FLAG_KEYред рд╕рднреА рдбрд┐рдХреЛрдбрд░ рд╕рдВрднрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рдХреБрдЫ рдХреНрд╖реЗрддреНрд░реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рд╣реИрдВредрд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдкрд░рд┐рдгрд╛рдо: рдЧрд▓рддреА рдкрд░, рдПрдХ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд╢реВрдиреНрдп рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рдлреНрд░реЗрдо рд╡рд┐рдШрдЯрд┐рдд рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИредint64_t av_frame_get_best_effort_timestamp (const AVFrame *frame)
AVFrame рдСрдмреНрдЬреЗрдХреНрдЯ рд╕реЗ best_effort_timestamp рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдПрдХреНрд╕реЗрд╕ рд╡рд┐рдзрд┐редAVCodec *avcodec_find_decoder(enum CodecID id)
рдХреЛрдбрдХ рдХреЗ рд╕рд╛рде рдбрд┐рдХреЛрдбрд░ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИред рддреНрд░реБрдЯрд┐ рдкрд░ рдкреВрд░реНрдг рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИред рдпрд╣ AVFormatContext рдореЗрдВ codecCtx-> codec_id рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдЖрд╡рд╢реНрдпрдХ AVCodecContext рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредvoid avcodec_flush_buffers(AVCodecContetx *avctx)
рдмрдлрд░ рдлреНрд▓рд╢ред рдХрд┐рд╕реА рдЕрдиреНрдп рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЦреЛрдЬ рдпрд╛ рд╕реНрд╡рд┐рдЪ рдХрд░рдиреЗ рдкрд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредAVCodecContext * avcodec_alloc_context3 (const AVCodec *codec)
AVCodecContext рдЕрд╕рд╛рдЗрди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдлрд╝реАрд▓реНрдб рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИредint avcodec_copy_context (AVCodecContext *dest, const AVCodecContext *src)
рд╕реНрд░реЛрдд AVCodecContext рдХреА рд╕реЗрдЯрд┐рдВрдЧ рдХреЛ рд▓рдХреНрд╖реНрдп AVCodecContext рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВред рдЧрдВрддрд╡реНрдп рдХреЛрдбреЗрдХ рдХрд╛ рдкрд░рд┐рдгрд╛рдореА рд╕рдВрджрд░реНрдн рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЕрд░реНрдерд╛рддред рд╡реАрдбрд┐рдпреЛ / рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЛ рдбреАрдХреЛрдб / рдПрдирдХреЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ AVCodecContext рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ avcodec_open2 () рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛редрдЧрдВрддрд╡реНрдп :, avcodec_alloc_context3 (рд╢реВрдиреНрдп) рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрдн рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЕрдиреНрдпрдерд╛ рдпрд╣ рдЖрд░рдВрдн рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рдЬрд╛рдПрдЧрд╛редint avcodec_open2(AVCodecContext *avctx, AVCodec *codec, AVDictionary **options)
Initializes рдХреЛрдбреЗрдХ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП avctx рдХреЛрдбреЗрдХ ред Avcodec_find_decoder рдХреЗ рдмрд╛рдж рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдлрд▓рддрд╛ рдкрд░ рд╢реВрдиреНрдп рдФрд░ рддреНрд░реБрдЯрд┐ рдкрд░ рдирдХрд╛рд░рд╛рддреНрдордХ рдорд╛рди рджреЗрддрд╛ рд╣реИредint avpicture_fill(AVPicture *picture, uint8_t *ptr, int pix_fmt, int width, int height)
рддрд╕реНрд╡реАрд░ рдХреЛ рдЙрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ ptr рдмрдлрд░ , pix_fmt рдкреНрд░рд╛рд░реВрдк рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рд╕рд╛рде рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ ред рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рдЫрд╡рд┐ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИредint avpicture_get_size(int pix_fmt, int width, int height)
рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рдЫрд╡рд┐ рдкреНрд░рд╛рд░реВрдк рдХреА рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдХрд┐рддрдиреЗ рдмрд╛рдЗрдЯреНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредstruct SwsContext* sws_getContext(int srcW, int srcH, int srcFormat, int dstW, int dstH, int dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, double *param)
Sws_scale рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП SwsContext рджреЗрддрд╛ рд╣реИредsrcW , srcH , srcFormat : рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдкреНрд░рд╛рд░реВрдкредdstW , dstH , dstFormat : рдЕрдВрддрд┐рдо рдкрд┐рдХреНрд╕рд▓ рдХреА рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рдкреНрд░рд╛рд░реВрдкредрдЭрдВрдбреЗ : рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреЗрд▓рд┐рдВрдЧ рд╡рд┐рдзрд┐редрдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдХрд▓реНрдк рдЙрдкрд▓рдмреНрдз рд╣реИрдВ: SWS_FAST_BILINEAR, SWS_BILINEAR, SWS_BICUBIC, SWS_XINT, SWS_POINT, SWS_AREA, SWS_BICUBLIN, SWS_GAUSS, SWS_SINC, SWS_LANCZOS, SWS_SPLINEредрдЕрдиреНрдп рдЭрдВрдбреЗ рдореЗрдВ CPU рдХреНрд╖рдорддрд╛ рдЭрдВрдбреЗ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ: SWS_CPU_CAPS_MMX, SWS_CPU_CAPS_MMX2, SWS_CPU_CAPS_3DNOW, SWS_CPU_CAPS_ALTIVECредрдЕрдиреНрдп рдЭрдВрдбреЗ рдореЗрдВ (рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд▓рд╛рдЧреВ рдирд╣реАрдВ) SWS_FULL_CHR_H_INT, SWS_FULL_CHR_H_INP рдФрд░ SWS_DIRECT_BGR рд╢рд╛рдорд┐рд▓ рд╣реИрдВредрдЕрдВрдд рдореЗрдВ, SWS_ACCURATE_RND рд╣реИ рдФрд░ рд╢рд╛рдпрдж рд╢реБрд░реБрдЖрддреА, SWS_PRINT_INFO рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИредрдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рдЙрдирдореЗрдВ рд╕реЗ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХреНрдпрд╛ рдХрд░рддреЗ рд╣реИрдВред рд╢рд╛рдпрдж рдореБрдЭреЗ рд▓рд┐рдЦреЗрдВ?srcFilter , dstFilter : рд╕реНрд░реЛрдд рдФрд░ рдЧрдВрддрд╡реНрдп рдХреЗ рд▓рд┐рдП SwsFilterред SwsFilter рд░рдВрдЧ / рдЪрдордХ рдХреЛ рдЫрд╛рдирдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдмрдирд╛рддрд╛ рд╣реИред рдбрд┐рдлреЙрд▓реНрдЯ рдорд╛рди рд╢реВрдиреНрдп рд╣реИредрдкрд░рдо : рдЧреБрдгрд╛рдВрдХ рд╡рд╛рд▓реЗ int [2] рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдкреНрд░рд▓реЗрдЦрд┐рдд рдирд╣реАрдВред рдпрд╣ рдорд╛рдирдХ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рдереЛрдбрд╝рд╛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдбрд┐рдлреЙрд▓реНрдЯ рдорд╛рди рд╢реВрдиреНрдп рд╣реИред рдХреЗрд╡рд▓ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮреЛрдВ рдХреЗ рд▓рд┐рдП!int sws_scale(SwsContext *c, uint8_t *src, int srcStride[], int srcSliceY, int srcSliceH, uint8_t dst[], int dstStride[]
sws_scale(sws_ctx, pFrame->data, pFrame->linesize, 0, is->video_st->codec->height, pict.data, pict.linesize);
рд╣рдорд╛рд░реЗ SwsContext * c рдореЗрдВ рд╣рдорд╛рд░реА рд╕реЗрдЯрд┐рдВрдЧ рдХреЗ рдЕрдиреБрд╕рд╛рд░ src
рдореЗрдВ рд╕реНрдХреЗрд▓ рдбреЗрдЯрд╛ ред srcStride рдФрд░ dstStride рд╕реНрд░реЛрдд рдФрд░ рдЧрдВрддрд╡реНрдп рдкрдВрдХреНрддрд┐ рдЖрдХрд╛рд░ рд╣реИрдВредSDL_TimerID SDL_AddTimer(Uint32 interval, SDL_NewTimerCallback callback, void *param)
рдПрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдмрд╛рдж рдЪрд▓рддрд╛ рд╣реИред рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди SDL_AddTimer рдХреЙрд▓ рд╕реЗ рд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд░ рдЕрдВрддрд░рд╛рд▓ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдЧрд▓реЗ рдЯрд╛рдЗрдорд░ рдЕрдВрддрд░рд╛рд▓ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рддрд╛ рд╣реИред (рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди рдкрд╛рд░рд┐рдд рдореВрд▓реНрдп рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИ, рддреЛ рдЯрд╛рдЗрдорд░ рдЙрд╕реА рдЧрддрд┐ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реИред) рдпрджрд┐ рдХреЙрд▓рдмреИрдХ рдХрд╛ рд░рд┐рдЯрд░реНрди рдорд╛рди 0 рд╣реИ, рддреЛ рдЯрд╛рдЗрдорд░ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрд╡рд░реНрддрдорд╛рди рдЯрд╛рдЗрдорд░ рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рд╣реИ SDL_RemoveTimer рдХреЛ рдЯрд╛рдЗрдорд░ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ (рдЬрд┐рд╕реЗ SDL_AddTimer рд╕реЗ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рдерд╛) рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛редрдЯрд╛рдЗрдорд░ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рдореБрдЦреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдкрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╕реНрд╡рдпрдВ рд╕реЗ рдХрд┐рд╕реА рднреА рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рд╣рдореЗрд╢рд╛ SDL_PushEvent рдкрд░ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдЯрд╛рдЗрдорд░ рдХреЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХреА рдбрд┐рдЧреНрд░реА рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрдо рд╕реЗ рдХрдо 10 рдПрдордПрд╕ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдЖрдо рдореВрд▓реНрдп рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк 16 рдПрдордПрд╕ рдЯрд╛рдЗрдорд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдХреЙрд▓рдмреИрдХ рдПрдХ рдЕрдирд▓реЛрдб рд╕рд┐рд╕реНрдЯрдо рдкрд░ рд▓рдЧрднрдЧ 20 рдПрдордПрд╕ рдХреЗ рдмрд╛рдж рд╢реБрд░реВ рд╣реЛрдЧрд╛ред рдпрджрд┐ рдЖрдкрдХреЛ рдПрдХ рдзреНрд╡рдЬ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ 30 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб (рдкреНрд░рддреНрдпреЗрдХ 33 рдПрдордПрд╕) рдХреА рдЧрддрд┐ рд╕реЗ рдлреНрд░реЗрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ, рддреЛ рдЖрдк 30 рдПрдордПрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЯрд╛рдЗрдорд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВ)ред рдпрджрд┐ рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ SDL_INIT_TIMER рдХреЛ SDL_Init рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛редрдЬреЛрдбрд╝реЗ рдЧрдП рдЯрд╛рдЗрдорд░ рдХреЗ рд▓рд┐рдП рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдпрд╛ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрдиреЗ рдкрд░ NULLредрдХреЙрд▓рдмреИрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░реВрдк:Uint32 callback ( Uint32, void * param)
int SDL_CondSignal(SDL_cond *cond)
рдзрд╛рдЧреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╝рд╛рд░ рдХрд░ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдкреБрдирдГ рдкреНрд░рд╛рд░рдВрдн рдХрд░рдиреЗ cond рд╣рд╛рд▓рдд рдЪрд░ ред рд╕рдлрд▓рддрд╛ рдкрд░ 0 рдФрд░ рддреНрд░реБрдЯрд┐ рдкрд░ -1 рджреЗрддрд╛ рд╣реИредint SDL_CondWait(SDL_cond *cond, SDL_mutex *mut);
рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдФрд░ рдереНрд░реЗрдб рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВ SDL_CondSignal рдпрд╛ SDL_CondBroadcast рдХреЛ рдХреЙрдиреНрдб рдХрдВрдбреАрд╢рди рдЪрд░ рдХреЗ рд▓рд┐рдП рдХреЙрд▓ рдХрд░реЗрдВ, рдлрд┐рд░ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рд▓реЙрдХ рдХрд░реЗрдВред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рджрд░реНрдЬ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЬрдм рд╕рдВрдХреЗрдд рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ 0 рдпрд╛ рддреНрд░реБрдЯрд┐ рдкрд░ -1 рд▓реМрдЯрддрд╛ рд╣реИредSDL_cond *SDL_CreateCond(void);
рдПрдХ рд╢рд░реНрдд рдЪрд░ рдмрдирд╛рддрд╛ рд╣реИредSDL_Thread *SDL_CreateThread(int (*fn)(void *), void *data);
SDL_CreateThread рдирд┐рд╖реНрдкрд╛рджрди рдХрд╛ рдПрдХ рдирдпрд╛ рд╕реВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рдЕрдкрдиреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛, рд╕рд┐рдЧреНрдирд▓ рд╣реИрдВрдбрд▓рд░, рдлрд╝рд╛рдЗрд▓ рдбрд┐рд╕реНрдХреНрд░рд┐рдкреНрдЯрд░ рдЖрджрд┐ рдХреА рд╕рдВрдкреВрд░реНрдг рд╡реИрд╢реНрд╡рд┐рдХ рдореЗрдореЛрд░реА рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдпрд╣ fn рдлрд╝рдВрдХреНрд╢рди рдЪрд▓рд╛рддрд╛ рд╣реИ , рдЗрд╕реЗ рд╢реВрдиреНрдп рдкреЙрдЗрдВрдЯрд░ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЬрдм рдХреЛрдИ рдорд╛рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ рддреЛ рдереНрд░реЗрдб рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИредvoid SDL_Delay (Uint32 );
рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрдЦреНрдпрд╛ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред SDL_Delay рдХрдо рд╕реЗ рдХрдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдордп рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рд╕рдВрднрд╡рддрдГ OS рдпреЛрдЬрдирд╛ рдХреЗ рдХрд╛рд░рдгредрдиреЛрдЯ: рдХрдо рд╕реЗ рдХрдо 10 рдПрдордПрд╕ рдХреА рджреЗрд░реА рдЧреНрд░реИрдиреНрдпреБрд▓реИрд░рд┐рдЯреА рдХреА рдЙрдореНрдореАрдж рдХрд░реЗрдВред рдХреБрдЫ рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдореЗрдВ рдЫреЛрдЯреЗ рдЙрдкрд╛рдп рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рдмрд╕реЗ рдЖрдо рд╡рд┐рдХрд▓реНрдк рд╣реИредSDL_Overlay *SDL_CreateYUVOverlay(int width, int height, Uint32 format, SDL_Surface *display);
SDL_CreateYUVOverlay рдкреНрд░рджрддреНрдд рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рдкреНрд░рд╛рд░реВрдк (рдЙрдкрд▓рдмреНрдз рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, SDL_Overlay рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛ рджреЗрдЦреЗрдВ) рдХрд╛ YUV рдУрд╡рд░рд▓реЗ рдмрдирд╛рддрд╛ рд╣реИред SDL_Overlay рджреЗрддрд╛ рд╣реИредрдкреНрд░рджрд░реНрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ SDL_SetVideoMode рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╕рддрд╣ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред"рдУрд╡рд░рд▓реЗ" рд╢рдмреНрдж рдЧрд▓рдд рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдУрд╡рд░рд▓реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдореЗрдВ рдирд╣реАрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдУрд╡рд░рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдкрд░ рдЙрд╕ рдХреНрд╖реЗрддреНрд░ рдХреЗ рдиреАрдЪреЗ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╕рддрд╣ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдУрд╡рд░рд▓реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редint SDL_LockYUVOverlay(SDL_Overlay *overlay)
SDL_LockYUVOverlay рдкрд┐рдХреНрд╕реЗрд▓ рдбреЗрдЯрд╛ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реЗ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред рд╕рдлрд▓рддрд╛ рдкрд░ 0 рдпрд╛ рддреНрд░реБрдЯрд┐ рдкрд░ -1 рдорд┐рд▓рддрд╛ рд╣реИредvoid SDL_UnlockYUVOverlay(SDL_Overlay *overlay)
рдкрд╣рд▓реЗ рд╕реЗ рдмрдВрдж рдУрд╡рд░рд▓реЗ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред рдУрд╡рд░рд▓реЗ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЕрдирд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредint SDL_DisplayYUVOverlay(SDL_Overlay *overlay, SDL_Rect *dstrect)
рдЬрдм рдпрд╣ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ рддреЛ рд╕рддрд╣ рдкрд░ рдУрд╡рд░рд▓реЗ рдХреЛ рдбрд╛рд▓рддрд╛ рд╣реИред SDL_Rect dstrect рд╕рдВрд░рдЪрдирд╛ рдЧрдВрддрд╡реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЖрдХрд╛рд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИред рдпрджрд┐ dstrect рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдУрд╡рд░рд▓реЗ рд╣реИ, рддреЛ рдУрд╡рд░рд▓реЗ рдХреЛ рд╕реНрдХреЗрд▓ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдпрд╣ 2x рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рд╣реИред 0 рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИредvoid SDL_FreeYUVOverlay(SDL_Overlay *overlay)
SDL_CreateYUVOverlay рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рдУрд╡рд░рд▓реЗ рдХреЛ рд░рд┐рд▓реАрдЬрд╝ рдХрд░рддрд╛ рд╣реИредint SDL_Init(Uint32 flags);
рдПрд╕рдбреАрдПрд▓ рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдЕрдиреНрдп рд╕рднреА рдПрд╕рдбреАрдПрд▓ рдХрд╛рд░реНрдпреЛрдВ рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЭрдВрдбреЗ рдкреИрд░рд╛рдореАрдЯрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрд╕рдбреАрдПрд▓ рдХреЗ рдХреМрди рд╕реЗ рд╣рд┐рд╕реНрд╕реЗ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реИредSDL_INIT_TIMER - рдЯрд╛рдЗрдорд░ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИредSDL_INIT_AUDIO - рдСрдбрд┐рдпреЛ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИредSDL_INIT_VIDEO - рд╡реАрдбрд┐рдпреЛ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИредSDL_INIT_CDROM - CD-ROM рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИредSDL_INIT_JOYSTICK - рдЬреЙрдпрд╕реНрдЯрд┐рдХ рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рддрд╛ рд╣реИредSDL_INIT_EVERYTHING - рдЙрдкрд░реЛрдХреНрдд рд╕рднреА рдХреЛ рдкреНрд░рд╛рд░рдВрдн рдХрд░рддрд╛ рд╣реИредSDL_INIT_NOPARACHUTE - SDL рдХреЛ рдШрд╛рддрдХ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИредSDL_INIT_EVENTTHREAD - рдЗрд╡реЗрдВрдЯ рдореИрдиреЗрдЬрд░ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИредрддреНрд░реБрдЯрд┐ рдкрд░ -1 рдпрд╛ рд╕рдлрд▓рддрд╛ рдкрд░ 0 рджреЗрддрд╛ рд╣реИред рдЖрдк SDL_GetError рдкрд░ рдХреЙрд▓ рдХрд░рдХреЗ рдПрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреНрд░реБрдЯрд┐ рдХрд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░рдг рд╕рдмрд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЗрд╕реА рд╕рдорд░реНрдерди рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рджрд░реНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рдлреНрд░реЗрдо рдмрдлрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдорд╛рдЙрд╕ рдбреНрд░рд╛рдЗрд╡рд░ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдпрд╛ рддреЛ рдорд╛рдЙрд╕ рдХреЗ рдмрд┐рдирд╛ SDL рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ "SDL_NOMOUSE = 1" рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредSDL_mutex *SDL_CreateMutex(void);
рдПрдХ рдирдпрд╛, рдЦреБрд▓рд╛ рдореНрдпреВрдЯреЗрдХреНрд╕ рдмрдирд╛рддрд╛ рд╣реИредint SDL_LockMutex(SDL_mutex *mutex)
SDL_LockMutex SDL_mutexP рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдиреНрдп рдирд╛рдо рд╣реИред рдпрд╣ рдПрдХ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдкрд╣рд▓реЗ SDL_CreateMutex рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдореНрдпреВрдЯреЗрдХреНрд╕ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд┐рд╕реА рдЕрдиреНрдп рдереНрд░реЗрдб рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реЛрдзрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ SDL_mutexP рддрдм рддрдХ рдХреЛрдИ рдорд╛рди рдирд╣реАрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдЙрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрд╡рд░реБрджреНрдз рдереНрд░реЗрдб рдЗрд╕реЗ рдЕрдирд▓реЙрдХ рдирд╣реАрдВ рдХрд░рддрд╛ (SDL_mutexV рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ)ред рдЬрдм рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдлрд┐рд░ рд╕реЗ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ SDL_mutexV (рдЙрд░реНрдл SDL_UnlockMutex) рдХреЛ рдореНрдпреВрдЯреЗрдХреНрд╕ рдХреЛ рдЕрдирд▓реЙрдХ рдХрд┐рдП рдЧрдП рд░рд╛рдЬреНрдп рдореЗрдВ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд░рд╛рдмрд░ рдмрд╛рд░ рдХрд╣рд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдлрд▓рддрд╛ рдкрд░ 0 рдпрд╛ рддреНрд░реБрдЯрд┐ рдкрд░ -1 рдорд┐рд▓рддрд╛ рд╣реИредint SDL_UnlockMutex(SDL_Mutex *mutex)
рдореНрдпреВрдЯреЗрдХреНрд╕ рдЕрдирд▓реЙрдХредint SDL_OpenAudio(SDL_AudioSpec *desired, SDL_AudioSpec *obtained)
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрд╡рд╢реНрдпрдХ рдорд╛рдирджрдВрдб рдХреЗ рд╕рд╛рде рдСрдбрд┐рдпреЛ рдпреВрдирд┐рдЯ рдХреЛ рдЦреЛрд▓рддрд╛ рд╣реИ рдФрд░ 0 рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд░рд┐рдЯрд░реНрди рджреЗрддрд╛ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдЙрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рдЕрдВрддрддрдГ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдХреЛрдИ NULL рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд╛рд╕ рдХрд┐рдП рдЧрдП рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЛ рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рд╛рд░реВрдк рдХреА рдЧрд╛рд░рдВрдЯреА рджреА рдЬрд╛рдПрдЧреА рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдСрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред рдпрджрд┐ рдСрдбрд┐рдпреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ рдЦреЛрд▓рд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрд╛ рдпрд╛ рдСрдбрд┐рдпреЛ рд╕реНрдЯреНрд░реАрдо рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрд╛ рддреЛ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди -1 рджреЗрддрд╛ рд╣реИредрдСрдбрд┐рдпреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЦреЛрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд╛рдВрдЫрд┐рдд SDL_AudioSpec рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд░ рдЖрдкрдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдСрдбрд┐рдпреЛ рд╡рд┐рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рднрд░рдирд╛ рд╣реЛрдЧрд╛редрд╡рд╛рдВрдЫрд┐рдд-> рдлреНрд░реАрдХ : рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдирдореВрдиреЛрдВ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдзреНрд╡рдирд┐ рдЖрд╡реГрддреНрддрд┐редрд╡рд╛рдВрдЫрд┐рдд-> рдкреНрд░рд╛рд░реВрдк : рд╡рд╛рдВрдЫрд┐рдд рдСрдбрд┐рдпреЛ рдкреНрд░рд╛рд░реВрдк (SDL_AudioSpec рджреЗрдЦреЗрдВ)редрд╡рд╛рдВрдЫрд┐рдд-> рдЪреИрдирд▓: рдЖрд╡рд╢реНрдпрдХ рдЪреИрдирд▓ (рдореЛрдиреЛ рдХреЗ рд▓рд┐рдП 1, рд╕реНрдЯреАрд░рд┐рдпреЛ рдХреЗ рд▓рд┐рдП 2, рд╕рд░рд╛рдЙрдВрдб рд╕рд╛рдЙрдВрдб рдХреЗ рд▓рд┐рдП 4, рд╕реЗрдВрдЯрд░рд┐рдВрдЧ рдФрд░ LFE рдХреЗ рд╕рд╛рде рдЪрд╛рд░реЛрдВ рдУрд░ рдзреНрд╡рдирд┐ рдХреЗ рд▓рд┐рдП 6)редрд╡рд╛рдВрдЫрд┐рдд-> рдирдореВрдиреЗ : рдирдореВрдиреЛрдВ рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рдСрдбрд┐рдпреЛ рдмрдлрд░ рдЖрдХрд╛рд░ред рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдФрд░ рдСрдбрд┐рдпреЛ рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЙрдкрдпреБрдХреНрдд рдореВрд▓реНрдп рдкрд░ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╖реНрдЯрддрдо рдорд╛рди 512 рд╕реЗ 8192 рддрдХ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЬреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдФрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдХреА рдЧрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдЫреЛрдЯреЗ рдорд╛рдиреЛрдВ рдХрд╛ рдкрд░рд┐рдгрд╛рдо рддреЗрдЬреА рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╕рдордп рдореЗрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЦрд░рд╛рдм рдкреНрд░рджрд░реНрд╢рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдпрджрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рднрд╛рд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдордп рдкрд░ рдСрдбрд┐рдпреЛ рдмрдлрд░ рдирд╣реАрдВ рднрд░ рд╕рдХрддрд╛ рд╣реИред рдПрд▓рдЖрд░ рдХреНрд░рдо рдореЗрдВ рд╕реНрдЯреАрд░рд┐рдпреЛ рд╕реИрдВрдкрд▓ рдореЗрдВ рджрд╛рдПрдВ рдФрд░ рдмрд╛рдПрдВ рдЪреИрдирд▓ рд╣реЛрддреЗ рд╣реИрдВред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирдореВрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╕реАрдзреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реВрддреНрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рд╕рдордп рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ: рдПрдордПрд╕ = (рдирдореВрдиреЗ * 1000) / freq рд╣реИ редрд╡рд╛рдВрдЫрд┐рдд-> рдХреЙрд▓рдмреИрдХ : рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕реЗ рддрдм рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдСрдбрд┐рдпреЛ рдпреВрдирд┐рдЯ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛред рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХреЗ рд╕реВрдЪрдХ рдФрд░ рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХреЗ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд▓рдВрдмрд╛рдИ рдкреНрд░реЗрд╖рд┐рдд рд╣реЛрддреА рд╣реИред рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдЕрд▓рдЧ рдереНрд░реЗрдб рдореЗрдВ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рдХреЛрдб рдореЗрдВ SDL_LockAudio рдФрд░ SDL_UnlockAudio рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХреА рд╕реБрд░рдХреНрд╖рд╛ рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдХреЙрд▓рдмреИрдХ рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк рд╣реИ рд╢реВрдиреНрдп рдХреЙрд▓рдмреИрдХ ( рд╢реВрдиреНрдп * userdata , Uint8 * рдзрд╛рд░рд╛ , рдкреВрд░реНрдгрд╛рдВрдХ рд▓реЗрди ) ред userdata - userdata рдХреНрд╖реЗрддреНрд░ SDL_AudioSpec рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдПрдХ рд╕реВрдЪрдХред рдзрд╛рд░рд╛рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдЬрд╛рдирдХрд╛рд░реА рд╕реЗ рднрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдЗрдЯ рдореЗрдВ рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХреА рд▓рдВрдмрд╛рдИ рд▓реЗрди рд╣реИредрдЖрд╡рд╢реНрдпрдХ-> рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдбреЗрдЯрд╛ : рдпрд╣ рд╕реВрдЪрдХ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдкрд╣рд▓реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредSDL_OpenAudio рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдкрд╛рд░рд┐рдд рд╡рд╛рдВрдЫрд┐рдд SDL_AudioSpec рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдЗрди рдлрд╝реАрд▓реНрдбреНрд╕ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреА рдЗрдЪреНрдЫрд╛ рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдСрдбрд┐рдпреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдЦреЛрдЬрдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрджрд┐ рдкрд░рд┐рдгрд╛рдореА рдкреИрд░рд╛рдореАрдЯрд░ NULL рд╣реИ, рддреЛ SDL рдХреЛ рдкреНрд▓реЗрдмреИрдХ рдХреЗ рджреМрд░рд╛рди рд╡рд╛рдВрдЫрд┐рдд рдзреНрд╡рдирд┐ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╕реЗ рдЙрдкрдХрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдпрджрд┐ NULL рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЖрд╡рд╢реНрдпрдХ SDL_AudioSpec рдЖрдкрдХреЗ рдХрд╛рд░реНрдп рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдЕрдиреНрдпрдерд╛ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк SDL_AudioSpec рдПрдХ рдХрд╛рд░реНрдп рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдмрди рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд╛рдВрдЫрд┐рдд рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдбреЗрдЯрд╛ рдХреЛ рдЙрдкрдХрд░рдг рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SDL_AudioCVT рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп рдХрд╛рд░реНрдп рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рдореЗрдВ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредSDL_OpenAudio рд╡рд╛рдВрдЫрд┐рдд рдФрд░ рдкрд░рд┐рдгрд╛рдореА рд╡рд┐рдирд┐рд░реНрджреЗрд╢ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдФрд░ рдореМрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рддрд╛ рд╣реИред рдЖрдХрд╛рд░ рдлрд╝реАрд▓реНрдб рдСрдбрд┐рдпреЛ рдмрдлрд╝рд░ рдХреЗ рдХреБрд▓ рдЖрдХрд╛рд░ рдХреЛ рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдореМрди рднрдВрдбрд╛рд░ рдХреЛ рдСрдбрд┐рдпреЛ рдмрдлрд╝рд░ рдореЗрдВ рдореМрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИрдЬрдм рдпрд╣ рдЦреБрд▓рд╛ рд╣реЛрддрд╛ рд╣реИ рддреЛ рд╕рд╛рдЙрдВрдб рдбрд┐рд╡рд╛рдЗрд╕ рдЦрд╛рдореЛрд╢реА рд╕реЗ рдмрдЬрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЖрдк рдСрдбрд┐рдпреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реЛрддреЗ рд╣реИрдВ рддреЛ SDL_PauseAudio (0) рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдкреНрд▓реЗрдмреИрдХ рдХреЗ рд▓рд┐рдП рдЪрд╛рд▓реВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдЪреВрдВрдХрд┐ рдСрдбрд┐рдпреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХреЗ рдЕрдиреБрд░реЛрдзрд┐рдд рдЖрдХрд╛рд░ рдХреЛ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдСрдбрд┐рдпреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐рд╕реА рднреА рд╕реНрдерд╛рдиреАрдп рдорд┐рдХреНрд╕рд░ рдмрдлрд╝рд░реНрд╕ рдХрд╛ рдЪрдпрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛редvoid SDL_PauseAudio(int pause_on)
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд░реБрдХ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдСрдбрд┐рдпреЛ рдХреЙрд▓рдмреИрдХ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреЛ рд░реЛрдХ рджреЗрддрд╛ рд╣реИред рдзреНрд╡рдирд┐ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдСрдбрд┐рдпреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдЗрд╕реЗ pause_on = 0 рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдЖрдкрдХреЛ рдСрдбрд┐рдпреЛ рдпреВрдирд┐рдЯ рдЦреЛрд▓рдиреЗ рдХреЗ рдмрд╛рдж рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЛ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдЖрд░рдВрдн рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдард╣рд░рд╛рд╡ рдХреЗ рджреМрд░рд╛рди рдСрдбрд┐рдпреЛ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рдореМрди рд░рд┐рдХреЙрд░реНрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редint SDL_PushEvent(SDL_Event *event)
рдПрдХ рдШрдЯрдирд╛ рдХрддрд╛рд░ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рджреЛ-рддрд░рдлрд╝рд╛ рд╕рдВрдЪрд╛рд░ рдЪреИрдирд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рддреА рд╣реИред рди рдХреЗрд╡рд▓ рдШрдЯрдирд╛рдУрдВ рдХреЛ рдХрддрд╛рд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд▓реНрдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдШрдЯрдирд╛рдУрдВ рдХреЛ рднреА рдЗрд╕рдореЗрдВ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдИрд╡реЗрдВрдЯ рдИрд╡реЗрдВрдЯ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдХрддрд╛рд░ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдИрд╡реЗрдВрдЯ рдХреЛ рдХрддрд╛рд░ рдореЗрдВ рдХреЙрдкреА рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдХреЙрд▓рд░ SDL_PushEvent рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЗрдВрдЧрд┐рдд рдХреА рдЧрдИ рдореЗрдореЛрд░реА рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдереНрд░реЗрдб-рдУрд░рд┐рдПрдВрдЯреЗрдб рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдиреНрдп рдереНрд░реЗрдбреНрд╕ рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред 0 рд╕рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рд░рд┐рдЯрд░реНрди, рдпрд╛ -1 рдЕрдЧрд░ рдЗрд╡реЗрдВрдЯ рдХреЛ рдирд╣реАрдВ рднреЗрдЬрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредint SDL_WaitEvent(SDL_Event *event)
рдЕрдЧрд▓реА рдЙрдкрд▓рдмреНрдз рдШрдЯрдирд╛ рдХреЗ рд▓рд┐рдП рдЕрдирд┐рд╢реНрдЪрд┐рдд рдХрд╛рд▓ рддрдХ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИ, 0 рдпрджрд┐ рдШрдЯрдирд╛рдУрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рд╣реИ, рддреЛ 1 рдЕрдиреНрдпрдерд╛ред рдпрджрд┐ рдИрд╡реЗрдВрдЯ NULL рдирд╣реАрдВ рд╣реИ, рддреЛ рдЕрдЧрд▓рд╛ рдИрд╡реЗрдВрдЯ рдХрддрд╛рд░ рд╕реЗ рдирд┐рдХрд╛рд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредvoid SDL_Quit()
рд╕рднреА рдПрд╕рдбреАрдПрд▓ рдЙрдкрддрдВрддреНрд░реЛрдВ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рд╣рдореЗрд╢рд╛ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредSDL_Surface *SDL_SetVideoMode(int width, int height, int bitsperpixel, Uint32 flags)
рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЪреМрдбрд╝рд╛рдИ, рдКрдВрдЪрд╛рдИ рдФрд░ рдкрд┐рдХреНрд╕реЗрд▓ рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ рдореЛрдб рд╕реЗрдЯрд┐рдВрдЧред рдПрд╕рдбреАрдПрд▓ 1.2.10 рд╕реЗ рд╢реБрд░реВ, рдЕрдЧрд░ рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ 0 рд╣реИ, рддреЛ рдпрд╣ рд╡рд░реНрддрдорд╛рди рд╡реАрдбрд┐рдпреЛ рдореЛрдб рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ (рдпрд╛ рдбреЗрд╕реНрдХрдЯреЙрдк рдореЛрдб рдпрджрд┐ рдореЛрдб рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред рдпрджрд┐ рдмрд┐рдЯрд╕реНрдкреЗрд░рд┐рдХреНрд╕рд▓ 0 рд╣реИ, рддреЛ рдЗрд╕реЗ рд╡рд░реНрддрдорд╛рди рдкреНрд░рджрд░реНрд╢рди рдмрд┐рдЯреНрд╕ рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЭрдВрдбреЗ рдкреИрд░рд╛рдореАрдЯрд░ SDL_Surface рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдЭрдВрдбреЗ рдХреНрд╖реЗрддреНрд░ рдХреЗ рд╕рдорд╛рди рд╣реИред рдпрд╛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдорд╛рдиреЛрдВ рдХрд╛ рдПрдХ рд╕рдВрдпреЛрдЬрди:SDL_SWSURFACE - рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕рддрд╣ рдмрдирд╛рдПрдВредSDL_HWSURFACE - рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕рддрд╣ рдмрдирд╛рдПрдВредSDL_ASYNCBLIT - рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣ рдкрд░ рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЕрдкрдбреЗрдЯ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд╕рдХреНрд╖рдо рдХрд░реЗрдВред рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рд╕рд┐рдВрдЧрд▓-рдкреНрд░реЛрд╕реЗрд╕рд░ рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдХрд╛рдо рдзреАрдорд╛ рдХрд░ рджреЗрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдПрд╕рдПрдордкреА рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЧрддрд┐ рдмрдврд╝рд╛ рд╕рдХрддрд╛ рд╣реИредSDL_ANYFORMAT - рдЖрдорддреМрд░ рдкрд░, рдпрджрд┐ рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ (рдмрд┐рдЯреНрд╕ рдкреНрд░рддрд┐ рдмрд┐рдЯ рдкрд┐рдХреНрд╕реЗрд▓ рд╕реЗ) рдЕрдиреБрд░реЛрдзрд┐рдд рдмрд┐рдЯреНрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реАрдбрд┐рдпреЛ рд╕рддрд╣ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ SDL рдПрдХ рдЫрд╛рдпрд╛рдВрдХрд┐рдд рд╕рддрд╣ рдХреЗ рд╕рд╛рде рд╡реАрдбрд┐рдпреЛ рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░реЗрдЧрд╛ред SDL_ANYFORMAT рдкрд╛рд╕ рдХрд░рдирд╛ рдЗрд╕реЗ рд░реЛрдХрддрд╛ рд╣реИ рдФрд░ SDL рдХреЛ рд╡реАрдбрд┐рдпреЛ рдХреА рд╕рддрд╣ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдЗрд╕рдХреА рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рдЧрд╣рд░рд╛рдИ рд╣реЛредSDL_HWPALETTE - рдкреИрд▓реЗрдЯ рдХреЗ рд▓рд┐рдП SDL рдЕрдирдиреНрдп рдкрд╣реБрдБрдЪ рдкреНрд░рджрд╛рди рдХрд░реЗрдВред рдЗрд╕ рдзреНрд╡рдЬ рдХреЗ рдмрд┐рдирд╛, рдЖрдк рд╣рдореЗрд╢рд╛ SDL_SetColors рдпрд╛ SDL_SetPalette рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд░реЛрдзрд┐рдд рд░рдВрдЧ рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗредSDL_DOUBLEBUF - рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдбрдмрд▓ рдмрдлрд░рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░реЗрдВ; рдХреЗрд╡рд▓ SDL_HWSURFACE рдХреЗ рд╕рд╛рде рдорд╛рдиреНрдп рд╣реИред SDL_Flip рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрд▓ рдмрдлрд╝рд░реНрд╕ рдХреЛ рдЙрд▓рдЯ рджреЗрдЧрд╛ рдФрд░ рд╕реНрдХреНрд░реАрди рдХреЛ рддрд╛рдЬрд╝рд╛ рдХрд░реЗрдЧрд╛ред рд╕рднреА рдбреНрд░рд╛рдЗрдВрдЧ рдПрдХ рд╕рддрд╣ рдкрд░ рдЬрдЧрд╣ рд▓реЗрдВрдЧреЗ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдирд╣реАрдВ рд╣реИред рдпрджрд┐ рдбрдмрд▓ рдмрдлрд╝рд░рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ SDL_Flip рдХреЗрд╡рд▓ SDL_UpdateRect рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛редSDL_FULLSCREEN SDL - рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВред рдпрджрд┐ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдХрд┐рд╕реА рднреА рдХрд╛рд░рдг рд╕реЗ), рдЕрдЧрд▓реЗ рдЙрдЪреНрдЪ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рд╡рд┐рдВрдбреЛ рдПрдХ рдХрд╛рд▓реЗ рд░рдВрдЧ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рдХреЗрдВрджреНрд░рд┐рдд рд╣реЛрдЧреАредSDL_OPENGL - рдПрдХ OpenGL рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдБред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ SDL_GL_SetAttribute рдХреЗ рд╕рд╛рде OpenGL рд╡реАрдбрд┐рдпреЛ рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдБ рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реИрдВредSDL_OPENGLBLIT - рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ OpenGL рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдБ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рдмреНрд▓рдЯрд┐рдВрдЧ рдСрдкрд░реЗрд╢рди рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдВред рд╕реНрдХреНрд░реАрди рдХреА рд╕рддрд╣ (2D) рдореЗрдВ рдПрдХ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рд╕реНрдХреНрд░реАрди рдХреА рд╕рддрд╣ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП SDL_UpdateRects рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдореЗрдВ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдирдП рдХреЛрдб рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИредSDL_RESIZABL- рдПрдХ resizable рд╡рд┐рдВрдбреЛ рдХреЛ рдмрдирд╛рдПрдБред рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ SDL_VIDEORESIZE рдШрдЯрдирд╛ рдЙрддреНрдкрдиреНрди рд╣реЛрддреА рд╣реИ, рдФрд░ SDL_SetVideoMode рдХреЛ рдлрд┐рд░ рд╕реЗ рдПрдХ рдирдП рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредSDL_NOFRAME рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ, рддреЛ SDL_NOFRAME SDL рдХреЛ рдмрд┐рдирд╛ рд╢реАрд░реНрд╖рдХ рдпрд╛ рдлрд╝реНрд░реЗрдордпреБрдХреНрдд рд╡рд┐рдВрдбреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╛рдзреНрдп рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдзреНрд╡рдЬ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЛрдб рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИредрдзреНрдпрд╛рди рджреЗрдВред рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рдХрд┐ SDL_SetVideoMode рдЭрдВрдбреЗ рд╕рдВрддреБрд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╡реЗ рд▓реМрдЯреЗ рд╕рддрд╣ рдХреЗ рддрддреНрд╡ рддрддреНрд╡ рдореЗрдВ рд╕реЗрдЯ рд╣реИрдВредрдзреНрдпрд╛рди рджреЗрдВред рдмрд┐рдЯ рдкрд┐рдХреНрд╕реЗрд▓ 24 рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ 3 рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдкреИрдХреНрдб рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддрд┐ рдкрд┐рдХреНрд╕реЗрд▓ рдореЛрдб рдореЗрдВ рдЕрдзрд┐рдХ рд╕рд╛рдорд╛рдиреНрдп 4 рдмрд╛рдЗрдЯ рдХреЗ рд▓рд┐рдП, 32 рдмрд┐рдЯ рдкрд┐рдХреНрд╕реЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╡рд┐рдЪрд┐рддреНрд░ рд░реВрдк рд╕реЗ рдкрд░реНрдпрд╛рдкреНрдд, 15 рдФрд░ 16 рджреЛрдиреЛрдВ рдПрдХ рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рддрд┐ 2 рдмрд╛рдЗрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╡рд┐рднрд┐рдиреНрди рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХреЗ рд╕рд╛рдередрдзреНрдпрд╛рди рджреЗрдВред рдпрджрд┐ рдЖрдк рдЕрд▓рдЧ рдкрд┐рдХреНрд╕реЗрд▓ рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХрд░рдиреЗ рдпрд╛ рдЕрд▓реНрдлрд╛ рдЪреИрдирд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рддрд╣реЛрдВ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП SDL_SWSURFACE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдЪреНрдЪ рдлреНрд░реЗрдо рджрд░ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдЬрдм рдЖрдк рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рддрд╣реЛрдВ (SDL_HWSURFACE) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ SDL рдЙрди рд╕рддрд╣реЛрдВ рдХреЛ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдореЗрдВ рдХреЙрдкреА рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЬрдм рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдирд▓реЙрдХ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рд╡рд╛рдкрд╕ред рдЗрд╕рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦрдиреАрдп рдХрдореА рдЖ рд╕рдХрддреА рд╣реИред (рдзреНрдпрд╛рди рд░рдЦреЗрдВ рдХрд┐ рдЖрдк рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рддрд╣ рдХреЗ рд▓рд┐рдП рдХреНрд╡реЗрд░реА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдПрдХ рд╕реЙрдлрд╝реНрдЯрд╡реЗрдпрд░ рд╕рддрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХрдИ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдХреЗрд╡рд▓ SDL_FULLSCREEN рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рдПрдХ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рд╕рддрд╣ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред) SDL_HWSURFACE рдХрд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рд╕реЛрдЪреА рдЧрдИ рд╕рддрд╣реЛрдВ рдХреЛ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рднреА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрдзреНрдпрд╛рди рджреЗрдВред рдпрджрд┐ рдЖрдк рд╡рд┐рдВрдбреЛ рдХреА рд╕рддрд╣ рдмрдирд╛рддреЗ рд╕рдордп рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ "SDL_VIDEO_CENTERED = рдХреЗрдВрджреНрд░" рдпрд╛ "SDL_VIDEO_WINDOW_POS" x, y "рд╕реЗрдЯ рдХрд░рдХреЗ рдРрд╕рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдк рдЙрдиреНрд╣реЗрдВ SDL_putenv рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрд╡рд╛рдкрд╕реА рдореВрд▓реНрдп: рд╡рд┐рдлрд▓рддрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрдлрд░ рдмрдлрд░ рд╕рддрд╣ рдпрд╛ NULLред рд▓реМрдЯреА рд╣реБрдИ рд╕рддрд╣ рдХреЛ SDL_Quit рджреНрд╡рд╛рд░рд╛ рдореБрдХреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдХреЙрд▓рд░ рджреНрд╡рд╛рд░рд╛ рдореБрдХреНрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредрдзреНрдпрд╛рди рджреЗрдВред рдЗрд╕ рдирд┐рдпрдо рдореЗрдВ SDL_SetVideoMode (рдпрд╛рдиреА, рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛) рдХреЗ рд▓рд┐рдП рд▓рдЧрд╛рддрд╛рд░ рдХреЙрд▓ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ - рдореМрдЬреВрджрд╛ рд╕рддрд╣ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдореБрдХреНрдд рд╣реЛ рдЬрд╛рдПрдЧреАред
рдкрд░рд┐рд╢рд┐рд╖реНрдЯ 2. рдбреЗрдЯрд╛ рд╕рд░рдВрдЪрдирд╛рдПрдВ тЖР тЗС тЖТ
AVCodecContext
AVStream-> рдХреЛрдбреЗрдХ рд╕реЗ рд╕реНрдЯреНрд░реАрдо рд╕реЗ рдХреЛрдбреЗрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рднреА рдЬрд╛рдирдХрд╛рд░реАред рдХреБрдЫ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдЧреБрдг:AVRational time_base : рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдбрдЗрдВрдЯ рдирдореВрдирд╛_рд░реЗрдЯ : рдирдореВрдиреЗ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдбрдЗрдВрдЯ рдЪреИрдирд▓ : рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛рдкреВрд░реА рд╕реВрдЪреА (рдмрд╣реБрдд рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА) рдпрд╣рд╛рдБ рджреЗрдЦреЗрдВ ( рд╡реЗрдм рд╕рдВрдЧреНрд░рд╣, рдХреНрдпреЛрдВрдХрд┐ рдореВрд▓ рд▓рд┐рдВрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИ )ред рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдбрд┐рдХреЛрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВредAVFormatContext
рдбреЗрдЯрд╛ рдлрд╝реАрд▓реНрдб:const AVClass * av_classAVInputFormat * iformatAVOutputFormat * oformatрд╢реВрдиреНрдп * priv_data :ByteIOContext pb : рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рд╣реЗрд░рдлреЗрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредрдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int nb_streams : рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдереНрд░реЗрдбреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛редAVStream * рд╕реНрдЯреНрд░реАрдо [MAX_STREAMS] : рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдЯреНрд░реАрдо рдХрд╛ рдбреЗрдЯрд╛ рдпрд╣рд╛рдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИредрдЪрд╛рд░ рдлрд╝рд╛рдЗрд▓рдирд╛рдо [резрежреиреж]: рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд┐рдирд╛ (рдореВрд▓- рдпреБрдЧрд▓ рдореЗрдВ ) рдХреНрдпрд╛ рд╣реИредрдлрд╝рд╛рдЗрд▓ рдЬрд╛рдирдХрд╛рд░реА:int64_t рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк :рдЪрд╛рд░ рд╢реАрд░реНрд╖рдХ [512]:char рд▓реЗрдЦрдХ [512]:char Copyright [512]:char рдЯрд┐рдкреНрдкрдгреА [512]:char рдПрд▓реНрдмрдо [512]:int рд╡рд░реНрд╖ :int track :char рд╢реИрд▓реА [рейреи]:int ctx_flags :рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдп AVFMT_NOEDNUMBER, AVFMT_NEEDNUMBER, AVFMT_SHOW_IDS, AVFMT_RAWPICT AVFMT_GLOBALHEADER, AVFMT_NOTIMESTAMPS, AVFMT_GENERIC_INDEXAVPacketList * packet_buffer : рдЗрд╕ рдмрдлрд░ рдХреА рдЬрд░реВрд░рдд рддрднреА рдкрдбрд╝рддреА рд╣реИ рдЬрдм рдкреИрдХреЗрдЯ рдкрд╣рд▓реЗ рд╕реЗ рдмрдлреЗрдб рди рд╣реЛрдВ рд▓реЗрдХрд┐рди рдбрд┐рдХреЛрдб рди рд╣реЛрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдордкреАрдИрдЬреА рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдХреЛрдбреЗрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПредint64_tstart_time : рдЬрдм рдбрд┐рдХреЛрдбрд┐рдВрдЧ: рдШрдЯрдХ рдХреЗ рдкрд╣рд▓реЗ рдлреНрд░реЗрдо рдХреА рд╕реНрдерд┐рддрд┐, рджреВрд╕рд░реЗ рдХреЗ рдЕрдВрд╢реЛрдВ рдореЗрдВ, AV_TIME_BASEред рдЗрд╕ рдорд╛рди рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рди рдХрд░реЗрдВ: рдпрд╣ AVStream рдХреЗ рдорд╛рдиреЛрдВ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИредint64_t рдЕрд╡рдзрд┐: рдбрд┐рдХреЛрдбрд┐рдВрдЧ : рдзрд╛рд░рд╛ рдХреА рдЕрд╡рдзрд┐, AV_TIME_BASE рдХреЗ рдЕрдВрд╢реЛрдВ рдореЗрдВред рдЗрд╕ рдорд╛рди рдХреЛ рд╕реАрдзреЗ рд╕реЗрдЯ рди рдХрд░реЗрдВ: рдпрд╣ AVStream рдХреЗ рдорд╛рдиреЛрдВ рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИредint64_t file_size : рдХреБрд▓ рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░, 0 рдпрджрд┐ рдЕрдЬреНрдЮрд╛рдд рд╣реИредint bit_rate : рдбрд┐рдХреЛрдбрд┐рдВрдЧ: рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ, рддреЛ рдмрд┐рдЯ / s, 0 рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХреА рдХреБрд▓ рдмрд┐рдЯрд░реЗрдЯред рдХрднреА рднреА рдЗрд╕реЗ рд╕реАрдзреЗ рд╕реЗрдЯ рди рдХрд░реЗрдВ рдЕрдЧрд░ file_size рдФрд░ ffmpeg рдореЗрдВ рдЬреНрдЮрд╛рдд рдЕрд╡рдзрд┐ рдЗрд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреА рд╣реИредAVStream * cur_stconst uint8_t * cur_ptrint cur_lenAVPacket cur_pkt :int64_t data_offset :int index_built : рдкрд╣рд▓реЗ рдкреИрдХреЗрдЯ рдХреА рднрд░рдкрд╛рдИредрдкреВрд░реНрдгрд╛рдВрдХ mux_rate :рдкреВрд░реНрдгрд╛рдВрдХ packet_size :рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░реАрд▓реЛрдб :рдкреВрд░реНрдгрд╛рдВрдХ max_delay :рдкреВрд░реНрдгрд╛рдВрдХ loop_output : рд╕рдорд░реНрдерд┐рдд рд╕реНрд╡рд░реВрдкреЛрдВ рдореЗрдВ рдЙрддреНрдкрд╛рджрди рдХрдИ рд▓реВрдк рдХреЗредint рдзреНрд╡рдЬ :int loop_input :рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int probesize : рдбрд┐рдХреЛрдбрд┐рдВрдЧ: рдирдореВрдирд╛ рдбреЗрдЯрд╛ рдЖрдХрд╛рд░; рдХреЛрдбрд┐рдВрдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВредint max_analyze_duration : AV_TIME_BASE рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдЕрдзрд┐рдХрддрдо рдЕрд╡рдзрд┐ рдЬрд┐рд╕рдХреЗ рджреМрд░рд╛рди рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг av_find_stream_info ()рдХреЙрдиреНрд╕реНрдЯ uint8_t * рдХреБрдВрдЬреА рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП :int keylen :AVIOContext
рд╕рдВрд╕рд╛рдзрдиреЛрдВ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП I / O рд╕рдВрджрд░реНрднредconst AVClass * av_class : рдирд┐рдЬреА рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд░реНрдЧредрдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * рдмрдлрд░ : рдмрдлрд░ рдХреА рд╢реБрд░реБрдЖрддредint рдмрдлрд░_рд╕рд╛рдЗрдЬ : рдЕрдзрд┐рдХрддрдо рдмрдлрд░ рдЖрдХрд╛рд░редрдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * buf_ptr : рдмрдлрд░ рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐редрдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * buf_end : рдбреЗрдЯрд╛ рдмрдлрд╝рд░ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЫреЛрдЯрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ + рдмрдлрд╝рд░_рд╕рд╛рдЗрдЬрд╝ рдпрджрд┐ рд░реАрдб рдлрд╝рдВрдХреНрд╢рди рдЕрдиреБрд░реЛрдз рдХреЗ рдореБрдХрд╛рдмрд▓реЗ рдХрдо рдбреЗрдЯрд╛ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПредрд╢реВрдиреНрдп * рдЕрдкрд╛рд░рджрд░реНрд╢реА : рдирд┐рдЬреА рд╕реВрдЪрдХ рдкрдврд╝рдиреЗ / рд▓рд┐рдЦрдиреЗ / рдЦреЛрдЬ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрддреНрддреАрд░реНрдг / ...int (* read_packet) (рд╢реВрдиреНрдп * opaque, uint8_t * buf, int buf_size) :int (* write_packet) (рд╢реВрдиреНрдп * opaque, uint8_t * buf, int buf_size ) :int64_t (* seek) (рд╢реВрдиреНрдп * opaque, int64_t рдСрдлрд╕реЗрдЯ, int whence ) : int64_t pos : рд╡рд░реНрддрдорд╛рди рдмрдлрд░ рдХреА рдлрд╛рдЗрд▓ рдореЗрдВ рд╕реНрдерд┐рддрд┐редint must_flush : рдпрджрд┐ рдЕрдЧрд▓реА рдЦреЛрдЬ рд░реАрд╕реЗрдЯ рдХреА рдЬрд╛рдиреА рдЪрд╛рд╣рд┐рдП рддреЛ рд╕рдЪ рд╣реИредint eof_reached : рдлрд╝рд╛рдЗрд▓ рдХреЗ рдЕрдВрдд рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдкрд░ рд╕рдЪ рд╣реИредint write_flag : рдпрджрд┐ рд▓реЗрдЦрди рдХреЗ рд▓рд┐рдП рдЦреБрд▓рд╛ рд╣реИ рддреЛ рд╕рдЪ рд╣реИредint max_packet_size :рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рдЪреЗрдХрд╕рдо :рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * рдЪреЗрдХрд╕рдо_рдкреНрдЯреНрд░ : рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА (* рдЕрдкрдбреЗрдЯ_рдЪреЗрдХрд╕рдо) (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рдЪреЗрдХрд╕рдо, рдХреЙрдиреНрд╕реНрдЯреЗрдВрдЯ uint8_t * buf, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЖрдХрд╛рд░) :рдЗрдВрдЯ рддреНрд░реБрдЯрд┐ : рддреНрд░реБрдЯрд┐ рдХреЛрдб рдпрд╛ 0 рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИредint (* read_pause) (рд╢реВрдиреНрдп * рдЕрдкрд╛рд░рджрд░реНрд╢реА, int рдард╣рд░рд╛рд╡): рдиреЗрдЯрд╡рд░реНрдХ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдкреНрд▓реЗрдмреИрдХ рдХреЛ рд░реЛрдХреЗрдВ рдпрд╛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдПредint64_t (* read_seek) (рд╢реВрдиреНрдп * opaque, int stream_index, int64_t рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк, рдЗрдВрдЯ рдлреНрд▓реИрдЧ) : рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реНрдЯреНрд░реАрдо_index рдЗрдВрдбреЗрдХреНрд╕ рдХреЗ рд╕рд╛рде рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдк рдХреА рдЦреЛрдЬ рдХрд░реЗрдВредint рдЦреЛрдЬреА : AVIO_SEEKABLE_ рдпрд╛ 0 рдЭрдВрдбреЗ рдХрд╛ рд╕рдВрдпреЛрдЬрди рдЬрдм рд╕реНрдЯреНрд░реАрдо рдЦреЛрдЬ рдпреЛрдЧреНрдп рдирд╣реАрдВ рд╣реИредint64_t рдЕрдзрд┐рдХрддрдо: рдЪрдпрди рдХреЛ рд╕реАрдорд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рдлрд╝рд╛рдЗрд▓ рдЖрдХрд╛рд░ред рдпрд╣ рдлрд╝реАрд▓реНрдб рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдФрд░ рдмрд╛рд╣рд░ рд╕реЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИредint direct : avio_read рдФрд░ avio_write рдХреЛ рдЬрдм рднреА рд╕рдВрднрд╡ рд╣реЛ рд╕реАрдзреЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдмрдлрд░ рд╕реЗ рдирд╣реАрдВ рдЧреБрдЬрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ avio_seek рд╣рдореЗрд╢рд╛ рд╕реАрдзреЗ рдореБрдЦреНрдп рдЦреЛрдЬ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧрд╛редint64_t рдмрд╛рдЗрдЯреНрд╕_рдбреНрд░реЗрдб: рдмрд╛рдЗрдЯ рдЖрдБрдХрдбрд╝реЗ рдкрдврд╝реЗрдВ рдпрд╣ рдХреНрд╖реЗрддреНрд░ libavformat рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ рдФрд░ рдмрд╛рд╣рд░реА рдкрд╣реБрдВрдЪ рд╕реЗ рд╡рдВрдЪрд┐рдд рд╣реИредint seek_count : рдЦреЛрдЬ рдЖрдБрдХрдбрд╝реЗред рдпрд╣ рдлрд╝реАрд▓реНрдб рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдФрд░ рдмрд╛рд╣рд░ рд╕реЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИредint writeout_count : рдЖрдВрдХрдбрд╝реЗ рд▓рд┐рдЦреЗрдВред рдпрд╣ рдлрд╝реАрд▓реНрдб рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдФрд░ рдмрд╛рд╣рд░ рд╕реЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИредint Origin_buffer_size : рдмрдлрд░ рдЖрдХрд╛рд░ рдХреЛ рд░реАрд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕реА рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдореВрд▓ рдмрдлрд░ рдЖрдХрд╛рд░ рдЖрдВрддрд░рд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝реАрд▓реНрдб рдХрд╛рдорд╡рд╛рд╕рдирд╛ рдХреЗ рд▓рд┐рдП рдЖрдВрддрд░рд┐рдХ рд╣реИ, рдФрд░ рдмрд╛рд╣рд░ рд╕реЗ рдЗрд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдирд┐рд╖рд┐рджреНрдз рд╣реИредAVDictionary
Ffmpeg рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредint рдХрд╛рдЙрдВрдЯ :рдПрд╡реЗрд░рдбреЗрдиреЗрдЯреНрд░реА * рдПрд▓рдореНрд╕ :AVDictionaryEntry
рдПрд╡рд╛рд░реНрдб рдореЗрдВ рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреБрдХреНрддредchar * ket :char * value :AVFrame
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдХреЛрдбреЗрдХ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ рдФрд░ рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рд╛рдорд╛рдиреНрдп рдЧреБрдг рдФрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВ:uint8_t * рдбреЗрдЯрд╛ [4] :int рд▓рд╛рдЗрдиреЗрдВ [4] : рд╕реНрдЯреНрд░рд╛рдЗрдб рд╕реНрдЯреНрд░рд╛рдЗрдбредuint8_t * рдЖрдзрд╛рд░ [4] :int key_frame :int pict_type :int64_t pts : рдпреЗ рд╡реЛ pts рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдирдХреА рдЖрдк рдбреАрдХреЛрдбрд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВредint coded_picture_number :int display_picture_number :int рдЧреБрдгрд╡рддреНрддрд╛ :int рдЙрдореНрд░ :int рд╕рдВрджрд░реНрдн :int8_t * qscale_table :int qstride :uint8_t * mbskipiptable :int16_t (* motion_val [2]) [2] [2]:Uint32_t * mb_type :uint8_t motion_subsample_log2 :рд╢реВрдиреНрдп * рдЕрдкрд╛рд░рджрд░реНрд╢реА : рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛uint64_t рддреНрд░реБрдЯрд┐ [4] :рдкреВрд░реНрдгрд╛рдВрдХ рдкреНрд░рдХрд╛рд░ :рдкреВрд░реНрдгрд╛рдВрдХ repeat_pict : рдирд┐рд░реНрджреЗрд╢ рджреЗрддрд╛ рд╣реИ рдЖрдк рдЫрд╡рд┐ рд╕рдордп рдХреА рдПрдХ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЛрд╣рд░рд╛рдиреЗ рдХреЗ рд▓рд┐рдПредint qscale_type :int interlaced_frame :int top_field_first :AVPanScan * pan_scan :int palette_has_changed :int рдмрдлрд░_рд╣рд┐рдиреНрдЯреНрд╕ :рд▓рдШреБ * dct_coeff ,int8_t * ref_index [2] :AVPacket
рд╡рд╣ рд╕рдВрд░рдЪрдирд╛ рдЬрд┐рд╕рдореЗрдВ рдХрдЪреНрдЪрд╛ рдкреИрдХреЗрдЯ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдбреЗрдЯрд╛ рдПрдХ рдлреНрд░реЗрдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП avcodec_decode_audio2 рдпрд╛ avcodec_decode_video рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредint64_t pts : time_base рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдкреНрд░рд╕реНрддреБрддрд┐ рдЯрд╛рдЗрдорд╕реНрдЯреИрдореНрдкредint64_t dts : time_base рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдЕрдкрдШрдЯрди рдХрд╛ рд╕рдордп рдЯрд┐рдХрдЯредuint8_t * рдбреЗрдЯрд╛ : рдХрдЪреНрдЪрд╛ рдбреЗрдЯрд╛редint рдЖрдХрд╛рд░ : рдбреЗрдЯрд╛ рдЖрдХрд╛рд░редint stream_index : AVFackatContext рдореЗрдВ рдорд╛рддреНрд░рд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЬрд┐рд╕ рд╕реНрдЯреНрд░реАрдо рд╕реЗ AVPacket рдЖрдпрд╛ рдерд╛редint рдЭрдВрдбреЗ : PKT_FLAG_KEY рд╕реЗрдЯ рд╣реИ рдЕрдЧрд░ рдкреИрдХреЗрдЯ рдПрдХ рдкреНрд░рдореБрдЦ рдлреНрд░реЗрдо рд╣реИредint рдЕрд╡рдзрд┐ : time_base рдХреА рдЗрдХрд╛рдЗрдпреЛрдВ рдореЗрдВ рдкреНрд░рд╕реНрддреБрддрд┐ рдХреА рдЕрд╡рдзрд┐ (0 рдпрджрд┐ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИ)рд╢реВрдиреНрдп (* рдбрд┐рд╕реНрдЯреНрд░рдХреНрдЯ) (рд╕реНрдЯреНрд░рдХреНрдЪрд░ рдПрд╡реАрдкреИрдХреЗрдЯ *) : рдЗрд╕ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рд░рд┐рд╕реЛрд░реНрд╕ рд░рд┐рд▓реАрдЬ рдлрдВрдХреНрд╢рди (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ av_destruct_packet)редрд╢реВрдиреНрдп * рдирд┐рдЬреА :int64_t рдкреЙрдЬрд╝ : рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдмрд╛рдЗрдЯ рдХреА рд╕реНрдерд┐рддрд┐, -1 рдпрджрд┐ рдЕрдЬреНрдЮрд╛рдд рд╣реИредAVPacketList
рд╕рдВрдХреБрд▓ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рд▓рд┐рдВрдХ рдХреА рдЧрдИ рд╕реВрдЪреАредAVPacket pkt :AVPacketList * рдЕрдЧрд▓рд╛ :AVPicture
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рдкрд╣рд▓реЗ рджреЛ AVFrame рдбреЗрдЯрд╛ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рдорд╛рди рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдЦрд╛рд░рд┐рдЬ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдПрд╕рдбрдмреНрд▓реНрдпреВрдПрд╕ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредuint8_t * рдбреЗрдЯрд╛ [4] :рдЗрдВрдЯ рд▓рд╛рдЗрдиреНрд╕ [4] : рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдмрд╛рдЗрдЯреНрд╕ рдХреА рд╕рдВрдЦреНрдпрд╛редAVRational
рддрд░реНрдХрд╕рдВрдЧрдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд░рд▓ рд╕рдВрд░рдЪрдирд╛редint num : рдЕрдВрд╢редint den : рд╣рд░редAVStream
рдзрд╛рд░рд╛ рдХреЗ рд▓рд┐рдП рд╕рдВрд░рдЪрдирд╛ред рдЖрдк рдЗрд╕ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЛрдбреЗрдХ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд░рдЦрддреЗ рд╣реИрдВредрдкреВрд░реНрдгрд╛рдВрдХ рд╕реВрдЪрдХрд╛рдВрдХ :рдкреВрд░реНрдгрд╛рдВрдХ рдЖрдИрдбреА :AVCodecContext * рдХреЛрдбреЗрдХ :AVRational r_frame_rate :рд╢реВрдиреНрдп * priv_data :int64_t codec_info_duration :рдкреВрд░реНрдгрд╛рдВрдХ codec_info_nb_frames :AVFrac рдЕрдВрдХ :AVRational time_base :рдкреВрд░реНрдгрд╛рдВрдХ pts_wrap_bits :рдкреВрд░реНрдгрд╛рдВрдХ stream_copy :рдПрдХ enum рдЫреЛрдбрд╝реЗрдВ AVDiscard рдЖрдк рд╕рдВрдХреБрд▓ рдХрд┐ рджреВрд░ рдлреЗрдВрдХ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИ рдЪреБрди рд╕рдХрддреЗ рд╣реИрдВ: рд▓реЛрдХрддрдВрддреНрд░ рдореЗрдВрдлреНрд▓реЛрдЯ рдХреА рдЧреБрдгрд╡рддреНрддрд╛ :int64_t start_time :int64_t рдЕрд╡рдзрд┐:рдЪрд╛рд░ [4] рднрд╛рд╖рд╛ :рдкреВрд░реНрдгрд╛рдВрдХ need_parsing : 1 -> рдкреВрд░реНрдг рдкрд╛рд░реНрд╕, 2 рдХреА рдЬрд░реВрд░рдд рд╣реИ - рдХреЗрд╡рд▓> рдкрд╛рд░реНрд╕ рд╣реЗрдбрд░, repacking рдмрд┐рдирд╛AVCodecParserContext * рдкрд╛рд░реНрд╕рд░ :int64_t cur_dts :рдкреВрд░реНрдгрд╛рдВрдХ last_IP_duration :int64_t last_IP_pts :AVIndexEntry * index_entries :рдкреВрд░реНрдгрд╛рдВрдХ nb_index_entries :рдПрдХ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int index_entries_allocated_size :int64_t nb_frames : рдЗрд╕ рдзрд╛рд░рд╛ рдореЗрдВ рдлрд╝реНрд░реЗрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдпрджрд┐ рдЬреНрдЮрд╛рдд рд╣реЛ) рдпрд╛ 0int64_t pts_buffer [MAX_REORDER_DELAY + 1] :ByteIOContext
рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдЬреЛ рдореВрд╡реА рдлрд╝рд╛рдЗрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддреА рд╣реИредрдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * рдмрдлрд░ :рдЗрдВрдЯ рдмрдлрд░_рд╕рд╛рдЗрдЬ :рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * buf_ptr :рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * buf_end :рд╢реВрдиреНрдп * рдЕрдкрд╛рд░рджрд░реНрд╢реА :int (* read_packet) (рд╢реВрдиреНрдп * рдЕрдкрд╛рд░рджрд░реНрд╢реА, uinto_t * buf, int buf_size) :int (* write_packet) (рд╢реВрдиреНрдп) uint8_t * buf, рдкреВрд░реНрдгрд╛рдВрдХ buf_size) :offset_t (* рддрд▓рд╛рд╢) (рд╢реВрдиреНрдп * рдЕрдкрд╛рд░рджрд░реНрд╢реА, offset_t рдСрдлрд╕реЗрдЯ, рдкреВрд░реНрдгрд╛рдВрдХ рдЬрд┐рд╕ рдХрд╛рд░рдг рд╕реЗ) :рд╕реНрдерд┐рддрд┐ offset_t :рдкреВрд░реНрдгрд╛рдВрдХ must_flush :рдкреВрд░реНрдгрд╛рдВрдХ eof_reached :рдкреВрд░реНрдгрд╛рдВрдХ write_flag :рдкреВрд░реНрдгрд╛рдВрдХ is_streamed :рдкреВрд░реНрдгрд╛рдВрдХ max_packet_size :рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рдЪреЗрдХрд╕рдо :рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдЪрд╛рд░ * рдЪреЗрдХрд╕рдо_рдкреНрдЯреНрд░
: рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА (* рдЕрджреНрдпрддрди_рдЪреЗрдХрд╕рдо) (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рд▓рдВрдмреА рдЪреЗрдХрд╕рдо: рдХреЙрдиреНрд╕реНрдЯ uint8_t * buf, рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд int рдЖрдХрд╛рд░) :рдЗрдВрдЯ рддреНрд░реБрдЯрд┐ : рддреНрд░реБрдЯрд┐ рдХреЛрдб рдпрд╛ 0 рд╣реЛрддрд╛ рд╣реИ рдпрджрд┐ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рдирд╣реАрдВ рд╣реБрдИ рд╣реИредSDL_AudioSpec
рдХреБрдЫ рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдХреЗ рдкреНрд░рд╛рд░реВрдк рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредfreq : рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдирдореВрдиреЛрдВ рдореЗрдВ рдзреНрд╡рдирд┐ рдЖрд╡реГрддреНрддрд┐редрдкреНрд░рд╛рд░реВрдк : рдСрдбрд┐рдпреЛ рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдкредрдЪреИрдирд▓ : рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛: 1 - рдореЛрдиреЛ, 2 - рд╕реНрдЯреАрд░рд┐рдпреЛ, 4 рд╕рд░рд╛рдЙрдВрдб, 6 рд╕рд░рд╛рдЙрдВрдбрд┐рдВрдЧ рдФрд░ LFEрд╕рд╛рдЗрд▓реЗрдВрд╕ рдХреЗ рд╕рд╛рде : рд╕рд╛рдЙрдВрдб рдмрдлрд░ рдХреА рд╕рд╛рдЗрд▓реЗрдВрд╕ рд╡реИрд▓реНрдпреВ (рдЧрдгрдирд╛)редрдирдореВрдиреЗ : рдирдореВрдиреЛрдВ рдореЗрдВ рдСрдбрд┐рдпреЛ рдмрдлрд░ рдЖрдХрд╛рд░редрдЖрдХрд╛рд░ : рдмрд╛рдЗрдЯреНрд╕ (рдЧрдгрдирд╛) рдореЗрдВ рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХрд╛ рдЖрдХрд╛рд░редрдХреЙрд▓рдмреИрдХ (..) : рдСрдбрд┐рдпреЛ рдмрдлрд░ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдиредuserdata : рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдЬреЛ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИредрдирд┐рдореНрди рдкреНрд░рд╛рд░реВрдк рдорд╛рдирдорд╛рдиреНрдп рд╣реИрдВ : AUDIO_U8 - тАЛтАЛ8-рдмрд┐рдЯ рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдирдореВрдиреЗредAUDIO_S8 - 8-рдмрд┐рдЯ рдирдореВрдиреЛрдВ рдкрд░ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдХрд┐рдПредAUDIO_U16 рдпрд╛ AUDIO_U16LSB - рд╕рднреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 16-рдмрд┐рдЯ рдХрдо рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░) рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИредAUDIO_S16 рдпрд╛ AUDIO_S16LS - рд╕рднреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ (рдкреБрд░рд╛рдиреЗ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде 16-рдмрд┐рдЯ)рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИ AUDIO_U16MSB - рд╕рднреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ (рдЕрд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд 16-рдмрд┐рдЯ рдмрд┐рдЧ-рдПрдВрдбрд┐рдпрди) рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИредAUDIO_S16MS - рд╕рднреА рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ (рдЙрдЪреНрдЪ рдмрд╛рдЗрдЯ рдСрд░реНрдбрд░ рдХреЗ рд╕рд╛рде 16-рдмрд┐рдЯ) рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИредAUDIO_U16SYS: рдпрд╛ рддреЛ AUDIO_U16LSB рдпрд╛ AUDIO_U16MSB - рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИредAUDIO_S16SYS: рдпрд╛ рддреЛ AUDIO_S16LSB рдпрд╛ AUDIO_S16MSB - рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдкреНрд░реЛрд╕реЗрд╕рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИредSDL_Event
рдШрдЯрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмреБрдирд┐рдпрд╛рджреА рд╕рдВрд░рдЪрдирд╛редрдкреНрд░рдХрд╛рд░ : рдШрдЯрдирд╛ рдХрд╛ рдкреНрд░рдХрд╛рд░редрд╕рдХреНрд░рд┐рдп : рд╕рдХреНрд░рд┐рдпрдг рдШрдЯрдирд╛ (SDL_ActiveEvent рджреЗрдЦреЗрдВ)редрдХреБрдВрдЬреА : рдХреАрдмреЛрд░реНрдб рдИрд╡реЗрдВрдЯ (SDL_KeyboardEvent рджреЗрдЦреЗрдВ)редрдЧрддрд┐ : рдорд╛рдЙрд╕ рдЖрдВрджреЛрд▓рди рдШрдЯрдирд╛ (SDL_MouseMotionEvent рджреЗрдЦреЗрдВ)редрдмрдЯрди : рдорд╛рдЙрд╕ рдХреНрд▓рд┐рдХ рдЗрд╡реЗрдВрдЯ (SDL_MouseButtonEvent рджреЗрдЦреЗрдВ)редjaxis : рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдПрдХреНрд╕рд┐рд╕ рдореВрд╡рдореЗрдВрдЯ рдЗрд╡реЗрдВрдЯ (SDL_JoyAxisEvent рджреЗрдЦреЗрдВ)редjball : рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдЯреНрд░реИрдХрдмреЙрд▓ рдореВрд╡рдореЗрдВрдЯ рдЗрд╡реЗрдВрдЯ (SDL_JoyBallEvent рджреЗрдЦреЗрдВ)редjhat : рдЬреЙрдпрд╕реНрдЯрд┐рдХ рд╣реЗрдбрд░ рдореВрд╡рдореЗрдВрдЯ рдЗрд╡реЗрдВрдЯ (SDL_JoyHatEvent рджреЗрдЦреЗрдВ)редjbutton : рдЬреЙрдпрд╕реНрдЯрд┐рдХ рдмрдЯрди рджрдмрд╛рдиреЗ рдХреА рдШрдЯрдирд╛ (рджреЗрдЦреЗрдВ SDL_JoyButtonEvent)редрдЖрдХрд╛рд░: рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╡рд┐рдВрдбреЛ рдЖрдХрд╛рд░ рдкрд░рд┐рд╡рд░реНрддрди рдИрд╡реЗрдВрдЯ (SDL_ResizeEvent рджреЗрдЦреЗрдВ)редрдмреЗрдирдХрд╛рдм : рдЖрд╡реЗрджрди рдЦрд┐рдбрд╝рдХреА рдЦреБрд▓реА рдШрдЯрдирд╛ (рджреЗрдЦреЗрдВ SDL_ExposeEvent)редрдЫреЛрдбрд╝ рджрд┐рдпрд╛ : рдЖрд╡реЗрджрди рдирд┐рдХрд╛рд╕ рдЕрдиреБрд░реЛрдз рдШрдЯрдирд╛ (рджреЗрдЦреЗрдВ SDL_QuitEvent)редрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ : рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдШрдЯрдирд╛ (SDL_UserEvent рджреЗрдЦреЗрдВ)редsyswm : рдЕрдкрд░рд┐рднрд╛рд╖рд┐рдд рд╡рд┐рдВрдбреЛ рдкреНрд░рдмрдВрдзрдХ рдШрдЯрдирд╛ (SDL_SysWMEvent рджреЗрдЦреЗрдВ)редрдпрд╣рд╛рдБ рдШрдЯрдирд╛рдУрдВ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП SDL рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рджреЗрдЦреЗрдВ:SDL_ACTIVEEVENT SDL_ActiveEventSDL_KEYDOWN / UP SDL_KeyboardEventSDL_MOUSEMOTION SDL_MOUSEMOTIONрдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ SDL_MOUTBUTTONDOWN / UPSDL_KeyDownloadTeSDL_ActiveEvent SDL_KEYDDSDL_JoyHatEvent SDL_JOYHATMOTIONSDL_JOYBUTTONDOWN / рдпреВрдкреА SDL_JoyButtonEventSDL_VIDEORESIZE SDL_ResizeEventSDL_VIDEOEXPOSE SDL_ExposeEventSDL_Quit SDL_QuitEventSDL_USEREVENT SDL_UserEventSDL_SYSWMEVENT SDL_SysWMEventSDL_Overlay
YUV рдУрд╡рд░рд▓реЗредрдкреНрд░рд╛рд░реВрдк : рдУрд╡рд░рд▓реЗ рдкреНрд░рд╛рд░реВрдк (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ)редрдбрдмреНрд▓реНрдпреВ, рдПрдЪ : рдУрд╡рд░рд▓реЗ рдХреА рдЪреМрдбрд╝рд╛рдИ / рдКрдВрдЪрд╛рдИредрд╡рд┐рдорд╛рдиреЛрдВ : рдУрд╡рд░рд▓реЗ рдХреА рдпреЛрдЬрдирд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ред рдЖрдорддреМрд░ рдкрд░ рдпрд╛ рддреЛ 1 рдпрд╛ 3.рдкрд┐рдЪреЛрдВ : рдкреНрд░рддреНрдпреЗрдХ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдЗрдВрдбреЗрдВрдЯ рдХреА рдПрдХ рд╕рд░рдгреАред рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдмрд╛рдЗрдЯреНрд╕ рдореЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИредрдкрд┐рдХреНрд╕реЗрд▓ : рдкреНрд░рддреНрдпреЗрдХ рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдХреА рдПрдХ рд╕рд░рдгреАред рдЗрди рдмрд┐рдВрджреБрдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдУрд╡рд░рд▓реЗ рдХреЛ рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредhw_overlay : Overlay рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рдХреЗ рддреНрд╡рд░рд┐рдд рд╣реЛрдиреЗ рдкрд░ 1 рдкрд░ рд╕реЗрдЯ рдХрд░реЗрдВредSDL_Rect
рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░редSint16 x, y : рдЖрдпрдд рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдХреА рд╕реНрдерд┐рддрд┐редUint16 w, h : рдЖрдпрдд рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИредSDL_Rect рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдПрдХ рдЖрдпрддрд╛рдХрд╛рд░ рдХреНрд╖реЗрддреНрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ SDL_BlitSurface рджреНрд╡рд╛рд░рд╛ рдмреНрд▓рд┐рдЯрд┐рдВрдЧ рдХреЗ рдХреНрд╖реЗрддреНрд░реЛрдВ рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рд╡реАрдбрд┐рдпреЛ рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредSDL_Surface
рдмрд╛рд╣рд░реА рдкрдХреНрд╖ (рд╕рддрд╣) рдХреА рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд░рдЪрдирд╛редUint32 рдЭрдВрдбреЗ : рдмрд╛рд╣рд░реА stotrons рдХреЗ рдЭрдВрдбреЗред рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПредSDL_PixelFormat * рдкреНрд░рд╛рд░реВрдк : рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПредint w, h : рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИред рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПредUint16 рдкрд┐рдЪ : рдХрджрдоред рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПредрд╢реВрдиреНрдп * рдкрд┐рдХреНрд╕реЗрд▓ : рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд┐рдХреНрд╕реЗрд▓ рдбреЗрдЯрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕реВрдЪрдХред рдХреЗрд╡рд▓ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдХреЗ рд▓рд┐рдПредSDL_Rect clip_rect : рдХреНрд▓рд┐рдк рдХреЗ рдмрд╛рд╣рд░ рдЖрдпрддрд╛рдХрд╛рд░ред рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПредint refcount : рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдПредрдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╡реЗ рдирд┐рдЬреА рдХреНрд╖реЗрддреНрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рдирд╣реАрдВ рджрд┐рдЦрд╛рдП рдЧрдП рд╣реИрдВSDL_Surface "рдЧреНрд░рд╛рдлрд┐рдХ" рдореЗрдореЛрд░реА рдХреЗ рдПрдХ рдХреНрд╖реЗрддреНрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЦреАрдВрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╡реАрдбрд┐рдпреЛ рдмрдлрд░ рдлреНрд░реЗрдо рдХреЛ SDL_SetVideoMode рдФрд░ SDL_GetVideoSurface рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SDL_Surface рдХреЗ рд░реВрдк рдореЗрдВ рд▓реМрдЯрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдлрд╝реАрд▓реНрдб w рдФрд░ h рдкрд┐рдХреНрд╕реЗрд▓ рдореЗрдВ рд╕рддрд╣ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдорд╛рди рд╣реИрдВред рдкрд┐рдХреНрд╕реЗрд▓ рдлрд╝реАрд▓реНрдб рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд┐рдХреНрд╕реЗрд▓ рдбреЗрдЯрд╛ рдХрд╛ рдПрдХ рд╕рдВрдХреЗрддрдХ рд╣реИред рдиреЛрдЯ: рдЗрд╕ рдХреНрд╖реЗрддреНрд░ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рддрд╣ рдХреЛ (SDL_LockSurface рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рд▓реЙрдХ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдХреНрд▓рд┐рдк_ рд╕рд╣реА рдлрд╝реАрд▓реНрдб SDL_SetClipRect рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХреА рдЧрдИ рдЖрдпрдд рд╣реИредрдзреНрд╡рдЬ рдлрд╝реАрд▓реНрдб рдирд┐рдореНрди рдпрд╛ рдорд╛рдиреЛрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ:SDL_SWSURFACE - рдмрд╛рд╣рд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИредSDL_HWSURFACE - рдмрд╛рд╣рд░реА рдкрдХреНрд╖ рд╡реАрдбрд┐рдпреЛ рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИредSDL_ASYNCBLIT - рдпрджрд┐ рд╕рдВрднрд╡ рд╣реЛ рддреЛ рдмрд╛рд╣рд░реА рдЕрддреБрд▓реНрдпрдХрд╛рд▓рд┐рдХ рдЪрдХрд╛рдЪреМрдВрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредSDL_ANYFORMAT - рдХрд┐рд╕реА рднреА рдкрд┐рдХреНрд╕реЗрд▓ рдкреНрд░рд╛рд░реВрдк (рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣) рдХреА рдЕрдиреБрдорддрд┐ рд╣реИредSDL_HWPALETTE - рд╕рддрд╣ рдХрд╛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреИрд▓реЗрдЯ рд╣реИредSDL_DOUBLEBUF - рдбрдмрд▓ рдмрдлрд░ рд╕рддрд╣ (рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣)редSDL_FULLSCREEN - рдкреВрд░реНрдг-рд╕реНрдХреНрд░реАрди рд╕рддрд╣ (рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣)редSDL_OPENGL - рд╕рддрд╣ рдореЗрдВ рдПрдХ OpenGL рд╕рдВрджрд░реНрдн (рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣) рд╣реИредSDL_OPENGLBLIT - рд╕рддрд╣ рдУрдкрдирд┐рдВрдЧ (рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣) рдмреНрд▓рд┐рдВрдХрд┐рдВрдЧ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреА рд╣реИред рдзреНрдпрд╛рди рджреЗрдВред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХреЗрд╡рд▓ рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╣реИ рдФрд░ рдирдП рдХреЛрдб рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд рдирд╣реАрдВ рд╣реИредSDL_RESIZABLE - рдЖрдХрд╛рд░ (рдкреНрд░рджрд░реНрд╢рди рд╕рддрд╣) рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛ рд╕рдВрднрд╡ рд╣реИредSDL_HWACCEL - рд╕рддрд╣ рдмреНрд▓рд┐рдЯ рд╣рд╛рд░реНрдбрд╡реЗрдпрд░ рддреНрд╡рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредSDL_SRCCOLORKEY - рд╕реБрдкрд░рдлрд┐рд╢рд┐рдпрд▓рд┐рдЯреА рдХрд▓рд░ рдмреНрд▓рд┐рдЯрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредSDL_RLEACCEL - RLE рдХреЗ рдЙрдкрдпреЛрдЧ рд╕реЗ рд░рдВрдЧ рдирд┐рдЦрд░рддрд╛ рд╣реИредSDL_SRCALPHA - рд╕рд░рдлреЗрд╕ рдмреНрд▓рд┐рде рдЕрд▓реНрдлрд╛ рд╕рдореНрдорд┐рд╢реНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИредSDL_PREALLOC - рд╕рддрд╣ рдкреВрд░реНрд╡-рдЖрд╡рдВрдЯрд┐рдд рдореЗрдореЛрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИредSDL_Thread
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ src / thread / sdl_thread_c.h рджреЗрдЦреЗрдВредSDL_cond
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ src / thread / <system> /SDL_syscond.c рджреЗрдЦреЗрдВредSDL_mutex
рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╕реНрд╡рддрдВрддреНрд░ рд╣реИ, рдФрд░ рд╢рд╛рдпрдж рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕реНрд░реЛрдд рдХреЛрдб рдореЗрдВ src / thread / <system> /SDL_sysmutex.c рджреЗрдЦреЗрдВред
рд▓рд┐рдВрдХ тЖР тЗС
рдПрдХ FFmpeg рдФрд░ SDL рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдпрд╛ 1000 рд░реЗрдЦрд╛рдУрдВ рд╕реЗ рдХрдо рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ
FFmpeg , SDL FFmpeg HomePage SDL HomePage

рдХрдВрдкрдиреА EDISON рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░ рднреА рдкрдврд╝реЗрдВ:
рдПрдлрдПрдлрдПрдордкреАрдПрдл рд▓рд┐рдмрд╛рд╡ рдореИрдиреБрдЕрд▓