[рднрд╛рдЧ 2/2] FFmpeg рдФрд░ SDL рдХреЗ рд▓рд┐рдП рдЧрд╛рдЗрдб рдпрд╛ 1000 рд▓рд╛рдЗрдиреЛрдВ рд╕реЗ рдХрдо рдореЗрдВ рд╡реАрдбрд┐рдпреЛ рдкреНрд▓реЗрдпрд░ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ


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

рдФрд░ рдпрджреНрдпрдкрд┐ рд╣рдордиреЗ рдХреЛрд╢рд┐рд╢ рдХреА, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдЪрдордХрджрд╛рд░ рдкрд╛рда рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреА рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рдЕрдкрд░рд┐рд╣рд╛рд░реНрдп рд╣реИрдВ ред рдмрдЧреНрд╕ рдХреА рд░рд┐рдкреЛрд░реНрдЯ рдХрд░реЗрдВ (рдЕрдзрд┐рдорд╛рдирддрдГ рдирд┐рдЬреА рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ) - рдПрдХ рд╕рд╛рде рд╣рдо рдмреЗрд╣рддрд░ рдХрд░реЗрдВрдЧреЗред

рд╡рд┐рд╖рдп - рд╕реВрдЪреА


EDISON рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ - рд╡реЗрдм-рд╡рд┐рдХрд╛рд╕
EDISON.

, .

, , Axxon Next SureView Immix.

! ;-)

6: тЖР тЗС тЖТ


tutorial06.c
// tutorial05.c
// A pedagogical video player that really works!
//
// Code based on FFplay, Copyright (c) 2003 Fabrice Bellard, 
// and a tutorial by Martin Bohme (boehme@inb.uni-luebeckREMOVETHIS.de)
// Tested on Gentoo, CVS version 5/01/07 compiled with GCC 4.1.1
// With updates from https://github.com/chelyaev/ffmpeg-tutorial
// Updates tested on:
// LAVC 54.59.100, LAVF 54.29.104, LSWS 2.1.101, SDL 1.2.15
// on GCC 4.7.2 in Debian February 2015
// Use
//
// gcc -o tutorial05 tutorial05.c -lavformat -lavcodec -lswscale -lz -lm `sdl-config --cflags --libs`
// to build (assuming libavformat and libavcodec are correctly installed, 
// and assuming you have sdl-config. Please refer to SDL docs for your installation.)
//
// Run using
// tutorial04 myvideofile.mpg
//
// to play the video stream on your screen.

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>

#include <SDL.h>
#include <SDL_thread.h>

#ifdef __MINGW32__
#undef main /* Prevents SDL from overriding main() */
#endif

#include <stdio.h>
#include <assert.h>
#include <math.h>

// compatibility with newer API
#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; /* source height & width */
  int allocated;
  double pts;
} VideoPicture;

typedef struct VideoState {

  AVFormatContext *pFormatCtx;
  int             videoStream, audioStream;

  int             av_sync_type;
  double          external_clock; /* external clock base */
  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; /* used for AV difference average computation */
  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; ///<pts of last decoded frame / predicted pts of next decoded frame
  double          video_current_pts; ///<current displayed pts (different from video_clock if frame fifos are used)
  int64_t         video_current_pts_time;  ///<time (av_gettime) at which we updated video_current_pts - used to have running video pts
  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;

/* Since we only have one decoding thread, the Big Struct
   can be global in case we need it. */
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; /* maintained in the audio thread */
  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);
  }
}


/* Add or subtract samples to get a better sync, return new
   audio buffer size */
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 /*, nb_samples */;
    
    ref_clock = get_master_clock(is);
    diff = get_audio_clock(is) - ref_clock;

    if(diff < AV_NOSYNC_THRESHOLD) {
      // accumulate the diffs
      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) {
	    /* remove samples */
	    samples_size = wanted_size;
	  } else if(wanted_size > samples_size) {
	    uint8_t *samples_end, *q;
	    int nb;

	    /* add samples by copying final sample*/
	    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 {
      /* difference is TOO big; reset diff stuff */
      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) {
	/* if error, skip frame */
	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) {
	/* No data yet, get more frames */
	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);
      /* We have data, return it and come back for more later */
      return data_size;
    }
    if(pkt->data)
      av_free_packet(pkt);

    if(is->quit) {
      return -1;
    }
    /* next packet */
    if(packet_queue_get(&is->audioq, pkt, 1) < 0) {
      return -1;
    }
    is->audio_pkt_data = pkt->data;
    is->audio_pkt_size = pkt->size;
    /* if update, update the audio clock w/pts */
    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) {
      /* We have already sent all our data; get more */
      audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts);
      if(audio_size < 0) {
	/* If error, output silence */
	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; /* 0 means stop timer */
}

/* schedule a video refresh in 'delay' ms */
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; /* the pts from last time */
      if(delay <= 0 || delay >= 1.0) {
	/* if incorrect delay, use previous one */
	delay = is->frame_last_delay;
      }
      /* save for next time */
      is->frame_last_delay = delay;
      is->frame_last_pts = vp->pts;



      /* update delay to sync to audio if not master source */
      if(is->av_sync_type != AV_SYNC_VIDEO_MASTER) {
	ref_clock = get_master_clock(is);
	diff = vp->pts - ref_clock;
	
	/* Skip or repeat the frame. Take delay into account
	   FFPlay still doesn't "know if this is the best guess." */
	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;
      /* computer the REAL delay */
      actual_delay = is->frame_timer - (av_gettime() / 1000000.0);
      if(actual_delay < 0.010) {
	/* Really it should skip the picture instead */
	actual_delay = 0.010;
      }
      schedule_refresh(is, (int)(actual_delay * 1000 + 0.5));
      
      /* show the picture! */
      video_display(is);
      
      /* update queue for next picture! */
      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) {
    // we already have one make another, bigger/smaller
    SDL_FreeYUVOverlay(vp->bmp);
  }
  // Allocate a place to put our YUV image on that screen
  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;

  /* wait until we have space for a new pic */
  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;

  // windex is set to 0 initially
  vp = &is->pictq[is->pictq_windex];

  /* allocate or resize the buffer! */
  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;
    }
  }

  /* We have a place to put our picture on the queue */

  if(vp->bmp) {

    SDL_LockYUVOverlay(vp->bmp);
    vp->pts = pts;
    
    dst_pix_fmt = PIX_FMT_YUV420P;
    /* point pict at the queue */

    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];
    
    // Convert the image into YUV format that SDL uses
    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);
    /* now we inform our display thread that we have a pic ready */
    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) {
    /* if we have pts, set video clock to it */
    is->video_clock = pts;
  } else {
    /* if we aren't given a pts, set it to the clock */
    pts = is->video_clock;
  }
  /* update the video clock */
  frame_delay = av_q2d(is->video_ctx->time_base);
  /* if we are repeating a frame, adjust clock accordingly */
  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) {
      // means we quit getting packets
      break;
    }
    if(packet_queue_get(&is->videoq, packet, 1) < 0) {
      // means we quit getting packets
      break;
    }
    pts = 0;

    // Decode video frame
    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);

    // Did we get a video frame?
    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; // Error copying codec context
  }


  if(codecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
    // Set audio settings from codec info
    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;

  // Open video file
  if(avformat_open_input(&pFormatCtx, is->filename, NULL, NULL)!=0)
    return -1; // Couldn't open file

  is->pFormatCtx = pFormatCtx;
  
  // Retrieve stream information
  if(avformat_find_stream_info(pFormatCtx, NULL)<0)
    return -1; // Couldn't find stream information
  
  // Dump information about file onto standard error
  av_dump_format(pFormatCtx, 0, is->filename, 0);
  
  // Find the first video stream

  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;
  }

  // main decode loop

  for(;;) {
    if(is->quit) {
      break;
    }
    // seek stuff goes here
    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); /* no error; wait for user input */
	continue;
      } else {
	break;
      }
    }
    // Is this a packet from the video stream?
    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);
    }
  }
  /* all done - wait for it */
  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);
  }
  // Register all formats and codecs
  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);
  }

  // Make a screen to put our video
#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 )ред

рдпрд╣рд╛рдБ рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдп рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:

/* Add or subtract samples to get a better sync, return new
   audio buffer size */
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) {
      // accumulate the diffs
      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);

       /* Shrinking/expanding buffer code.... */

      }
    } else {
      /* difference is TOO big; reset diff stuff */
      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) {
  /* remove samples */
  samples_size = wanted_size;
} else if(wanted_size > samples_size) {
  uint8_t *samples_end, *q;
  int nb;

  /* add samples by copying final samples */
  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) {
      /* We have already sent all our data; get more */
      audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts);
      if(audio_size < 0) {
	/* If error, output silence */
	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;

  /* Skip or repeat the frame. Take delay into account
     FFPlay still doesn't "know if this is the best guess." */
  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
// tutorial05.c
// A pedagogical video player that really works!
//
// Code based on FFplay, Copyright (c) 2003 Fabrice Bellard, 
// and a tutorial by Martin Bohme (boehme@inb.uni-luebeckREMOVETHIS.de)
// Tested on Gentoo, CVS version 5/01/07 compiled with GCC 4.1.1
// With updates from https://github.com/chelyaev/ffmpeg-tutorial
// Updates tested on:
// LAVC 54.59.100, LAVF 54.29.104, LSWS 2.1.101, SDL 1.2.15
// on GCC 4.7.2 in Debian February 2015
// Use
//
// gcc -o tutorial05 tutorial05.c -lavformat -lavcodec -lswscale -lz -lm `sdl-config --cflags --libs`
// to build (assuming libavformat and libavcodec are correctly installed, 
// and assuming you have sdl-config. Please refer to SDL docs for your installation.)
//
// Run using
// tutorial04 myvideofile.mpg
//
// to play the video stream on your screen.

#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>

#include <SDL.h>
#include <SDL_thread.h>

#ifdef __MINGW32__
#undef main /* Prevents SDL from overriding main() */
#endif

#include <stdio.h>
#include <assert.h>
#include <math.h>

// compatibility with newer API
#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; /* source height & width */
  int allocated;
  double pts;
} VideoPicture;

typedef struct VideoState {

  AVFormatContext *pFormatCtx;
  int             videoStream, audioStream;

  int             av_sync_type;
  double          external_clock; /* external clock base */
  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; /* used for AV difference average computation */
  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; ///<pts of last decoded frame / predicted pts of next decoded frame
  double          video_current_pts; ///<current displayed pts (different from video_clock if frame fifos are used)
  int64_t         video_current_pts_time;  ///<time (av_gettime) at which we updated video_current_pts - used to have running video pts
  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;

/* Since we only have one decoding thread, the Big Struct
   can be global in case we need it. */
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; /* maintained in the audio thread */
  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);
  }
}


/* Add or subtract samples to get a better sync, return new
   audio buffer size */
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 /*, nb_samples */;
    
    ref_clock = get_master_clock(is);
    diff = get_audio_clock(is) - ref_clock;

    if(diff < AV_NOSYNC_THRESHOLD) {
      // accumulate the diffs
      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) {
	    /* remove samples */
	    samples_size = wanted_size;
	  } else if(wanted_size > samples_size) {
	    uint8_t *samples_end, *q;
	    int nb;

	    /* add samples by copying final sample*/
	    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 {
      /* difference is TOO big; reset diff stuff */
      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) {
	/* if error, skip frame */
	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) {
	/* No data yet, get more frames */
	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);
      /* We have data, return it and come back for more later */
      return data_size;
    }
    if(pkt->data)
      av_free_packet(pkt);

    if(is->quit) {
      return -1;
    }
    /* next packet */
    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 update, update the audio clock w/pts */
    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) {
      /* We have already sent all our data; get more */
      audio_size = audio_decode_frame(is, is->audio_buf, sizeof(is->audio_buf), &pts);
      if(audio_size < 0) {
	/* If error, output silence */
	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; /* 0 means stop timer */
}

/* schedule a video refresh in 'delay' ms */
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; /* the pts from last time */
      if(delay <= 0 || delay >= 1.0) {
	/* if incorrect delay, use previous one */
	delay = is->frame_last_delay;
      }
      /* save for next time */
      is->frame_last_delay = delay;
      is->frame_last_pts = vp->pts;



      /* update delay to sync to audio if not master source */
      if(is->av_sync_type != AV_SYNC_VIDEO_MASTER) {
	ref_clock = get_master_clock(is);
	diff = vp->pts - ref_clock;
	
	/* Skip or repeat the frame. Take delay into account
	   FFPlay still doesn't "know if this is the best guess." */
	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;
      /* computer the REAL delay */
      actual_delay = is->frame_timer - (av_gettime() / 1000000.0);
      if(actual_delay < 0.010) {
	/* Really it should skip the picture instead */
	actual_delay = 0.010;
      }
      schedule_refresh(is, (int)(actual_delay * 1000 + 0.5));
      
      /* show the picture! */
      video_display(is);
      
      /* update queue for next picture! */
      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) {
    // we already have one make another, bigger/smaller
    SDL_FreeYUVOverlay(vp->bmp);
  }
  // Allocate a place to put our YUV image on that screen
  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;

  /* wait until we have space for a new pic */
  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;

  // windex is set to 0 initially
  vp = &is->pictq[is->pictq_windex];

  /* allocate or resize the buffer! */
  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;
    }
  }
  /* We have a place to put our picture on the queue */

  if(vp->bmp) {

    SDL_LockYUVOverlay(vp->bmp);
    vp->pts = pts;
    
    dst_pix_fmt = PIX_FMT_YUV420P;
    /* point pict at the queue */

    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];
    
    // Convert the image into YUV format that SDL uses
    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);
    /* now we inform our display thread that we have a pic ready */
    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) {
    /* if we have pts, set video clock to it */
    is->video_clock = pts;
  } else {
    /* if we aren't given a pts, set it to the clock */
    pts = is->video_clock;
  }
  /* update the video clock */
  frame_delay = av_q2d(is->video_ctx->time_base);
  /* if we are repeating a frame, adjust clock accordingly */
  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) {
      // means we quit getting packets
      break;
    }
    if(packet_queue_get(&is->videoq, packet, 1) < 0) {
      // means we quit getting packets
      break;
    }
    pts = 0;

    // Decode video frame
    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);

    // Did we get a video frame?
    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; // Error copying codec context
  }


  if(codecCtx->codec_type == AVMEDIA_TYPE_AUDIO) {
    // Set audio settings from codec info
    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;

  // Open video file
  if(avformat_open_input(&pFormatCtx, is->filename, NULL, NULL)!=0)
    return -1; // Couldn't open file

  is->pFormatCtx = pFormatCtx;
  
  // Retrieve stream information
  if(avformat_find_stream_info(pFormatCtx, NULL)<0)
    return -1; // Couldn't find stream information
  
  // Dump information about file onto standard error
  av_dump_format(pFormatCtx, 0, is->filename, 0);
  
  // Find the first video stream

  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;
  }

  // main decode loop

  for(;;) {
    if(is->quit) {
      break;
    }
    // seek stuff goes here
    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); /* no error; wait for user input */
	continue;
      } else {
	break;
      }
    }
    // Is this a packet from the video stream?
    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);
    }
  }
  /* all done - wait for it */
  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);
  }
  // Register all formats and codecs
  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);
  }

  // Make a screen to put our video
#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;
      /*
       * If the video has finished playing, then both the picture and
       * audio queues are waiting for more data.  Make them stop
       * waiting and terminate normally.
       */
      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 {
     /* handle packet queues... more later... */

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_class
AVInputFormat * iformat
AVOutputFormat * 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_INDEX
AVPacketList * 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_st
const uint8_t * cur_ptr
int cur_len
AVPacket 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 : рдЗрд╕ рдзрд╛рд░рд╛ рдореЗрдВ рдлрд╝реНрд░реЗрдореЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ (рдпрджрд┐ рдЬреНрдЮрд╛рдд рд╣реЛ) рдпрд╛ 0
int64_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_ActiveEvent
SDL_KEYDOWN / UP SDL_KeyboardEvent
SDL_MOUSEMOTION SDL_MOUSEMOTION
рдХреГрдкрдпрд╛ рджреЗрдЦреЗрдВ SDL_MOUTBUTTONDOWN / UP
SDL_KeyDownloadTe
SDL_ActiveEvent SDL_KEYDD
SDL_JoyHatEvent SDL_JOYHATMOTION
SDL_JOYBUTTONDOWN / рдпреВрдкреА SDL_JoyButtonEvent
SDL_VIDEORESIZE SDL_ResizeEvent
SDL_VIDEOEXPOSE SDL_ExposeEvent
SDL_Quit SDL_QuitEvent
SDL_USEREVENT SDL_UserEvent
SDL_SYSWMEVENT SDL_SysWMEvent

SDL_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 рдХреЗ рдмреНрд▓реЙрдЧ рдкрд░ рднреА рдкрдврд╝реЗрдВ:


рдПрдлрдПрдлрдПрдордкреАрдПрдл рд▓рд┐рдмрд╛рд╡ рдореИрдиреБрдЕрд▓

All Articles