57 #include <SDL_thread.h>
66 #define MAX_QUEUE_SIZE (15 * 1024 * 1024)
68 #define EXTERNAL_CLOCK_MIN_FRAMES 2
69 #define EXTERNAL_CLOCK_MAX_FRAMES 10
72 #define SDL_AUDIO_MIN_BUFFER_SIZE 512
74 #define SDL_AUDIO_MAX_CALLBACKS_PER_SEC 30
77 #define SDL_VOLUME_STEP (0.75)
80 #define AV_SYNC_THRESHOLD_MIN 0.04
82 #define AV_SYNC_THRESHOLD_MAX 0.1
84 #define AV_SYNC_FRAMEDUP_THRESHOLD 0.1
86 #define AV_NOSYNC_THRESHOLD 10.0
89 #define SAMPLE_CORRECTION_PERCENT_MAX 10
92 #define EXTERNAL_CLOCK_SPEED_MIN 0.900
93 #define EXTERNAL_CLOCK_SPEED_MAX 1.010
94 #define EXTERNAL_CLOCK_SPEED_STEP 0.001
97 #define AUDIO_DIFF_AVG_NB 20
100 #define REFRESH_RATE 0.01
104 #define SAMPLE_ARRAY_SIZE (8 * 65536)
106 #define CURSOR_HIDE_DELAY 1000000
108 #define USE_ONEPASS_SUBTITLE_RENDER 1
129 #define VIDEO_PICTURE_QUEUE_SIZE 3
130 #define SUBPICTURE_QUEUE_SIZE 16
131 #define SAMPLE_QUEUE_SIZE 9
132 #define FRAME_QUEUE_SIZE FFMAX(SAMPLE_QUEUE_SIZE, FFMAX(VIDEO_PICTURE_QUEUE_SIZE, SUBPICTURE_QUEUE_SIZE))
348 static const char **vfilters_list =
NULL;
349 static int nb_vfilters = 0;
350 static char *afilters =
NULL;
360 #define FF_QUIT_EVENT (SDL_USEREVENT + 2)
366 static int opt_add_vfilter(
void *optctx,
const char *opt,
const char *
arg)
369 vfilters_list[nb_vfilters - 1] =
arg;
379 if (channel_count1 == 1 && channel_count2 == 1)
382 return channel_count1 != channel_count2 || fmt1 != fmt2;
389 return channel_layout;
406 if (pkt == &flush_pkt)
419 SDL_CondSignal(q->
cond);
427 SDL_LockMutex(q->
mutex);
429 SDL_UnlockMutex(q->
mutex);
431 if (pkt != &flush_pkt && ret < 0)
451 q->
mutex = SDL_CreateMutex();
456 q->
cond = SDL_CreateCond();
469 SDL_LockMutex(q->
mutex);
470 for (pkt = q->
first_pkt; pkt; pkt = pkt1) {
480 SDL_UnlockMutex(q->
mutex);
486 SDL_DestroyMutex(q->
mutex);
487 SDL_DestroyCond(q->
cond);
492 SDL_LockMutex(q->
mutex);
496 SDL_CondSignal(q->
cond);
498 SDL_UnlockMutex(q->
mutex);
503 SDL_LockMutex(q->
mutex);
506 SDL_UnlockMutex(q->
mutex);
515 SDL_LockMutex(q->
mutex);
544 SDL_UnlockMutex(q->
mutex);
633 }
while (!got_frame && !d->
finished);
653 if (!(f->
mutex = SDL_CreateMutex())) {
657 if (!(f->
cond = SDL_CreateCond())) {
678 SDL_DestroyMutex(f->
mutex);
679 SDL_DestroyCond(f->
cond);
684 SDL_LockMutex(f->
mutex);
685 SDL_CondSignal(f->
cond);
686 SDL_UnlockMutex(f->
mutex);
707 SDL_LockMutex(f->
mutex);
712 SDL_UnlockMutex(f->
mutex);
723 SDL_LockMutex(f->
mutex);
728 SDL_UnlockMutex(f->
mutex);
740 SDL_LockMutex(f->
mutex);
742 SDL_CondSignal(f->
cond);
743 SDL_UnlockMutex(f->
mutex);
755 SDL_LockMutex(f->
mutex);
757 SDL_CondSignal(f->
cond);
758 SDL_UnlockMutex(f->
mutex);
794 SDL_RenderFillRect(
renderer, &rect);
797 static int realloc_texture(SDL_Texture **texture, Uint32 new_format,
int new_width,
int new_height, SDL_BlendMode blendmode,
int init_texture)
801 if (SDL_QueryTexture(*texture, &format, &access, &w, &h) < 0 || new_width != w || new_height != h || new_format != format) {
804 SDL_DestroyTexture(*texture);
805 if (!(*texture = SDL_CreateTexture(
renderer, new_format, SDL_TEXTUREACCESS_STREAMING, new_width, new_height)))
807 if (SDL_SetTextureBlendMode(*texture, blendmode) < 0)
810 if (SDL_LockTexture(*texture,
NULL, &pixels, &pitch) < 0)
812 memset(pixels, 0, pitch * new_height);
813 SDL_UnlockTexture(*texture);
820 int scr_xleft,
int scr_ytop,
int scr_width,
int scr_height,
821 int pic_width,
int pic_height,
AVRational pic_sar)
826 if (pic_sar.
num == 0)
829 aspect_ratio =
av_q2d(pic_sar);
831 if (aspect_ratio <= 0.0)
833 aspect_ratio *= (float)pic_width / (
float)pic_height;
837 width =
lrint(height * aspect_ratio) & ~1;
838 if (width > scr_width) {
840 height =
lrint(width / aspect_ratio) & ~1;
842 x = (scr_width -
width) / 2;
843 y = (scr_height -
height) / 2;
844 rect->x = scr_xleft + x;
845 rect->y = scr_ytop + y;
846 rect->w =
FFMAX(width, 1);
847 rect->h =
FFMAX(height, 1);
874 if (*img_convert_ctx !=
NULL) {
877 if (!SDL_LockTexture(tex,
NULL, (
void **)pixels, pitch)) {
879 0, frame->
height, pixels, pitch);
880 SDL_UnlockTexture(tex);
917 sub_rect->
x = av_clip(sub_rect->
x, 0, sp->
width );
918 sub_rect->
y = av_clip(sub_rect->
y, 0, sp->
height);
919 sub_rect->
w = av_clip(sub_rect->
w, 0, sp->
width - sub_rect->
x);
920 sub_rect->
h = av_clip(sub_rect->
h, 0, sp->
height - sub_rect->
y);
930 if (!SDL_LockTexture(is->
sub_texture, (SDL_Rect *)sub_rect, (
void **)pixels, pitch)) {
932 0, sub_rect->
h, pixels, pitch);
957 #if USE_ONEPASS_SUBTITLE_RENDER
961 double xratio = (double)rect.w / (
double)sp->
width;
962 double yratio = (double)rect.h / (
double)sp->
height;
964 SDL_Rect *sub_rect = (SDL_Rect*)sp->
sub.
rects[i];
965 SDL_Rect target = {.
x = rect.x + sub_rect->x * xratio,
966 .y = rect.y + sub_rect->y * yratio,
967 .w = sub_rect->w * xratio,
968 .h = sub_rect->h * yratio};
977 return a < 0 ? a%b + b : a%
b;
982 int i, i_start, x, y1, y, ys, delay,
n, nb_display_channels;
983 int ch, channels,
h, h2;
985 int rdft_bits, nb_freq;
987 for (rdft_bits = 1; (1 << rdft_bits) < 2 * s->
height; rdft_bits++)
989 nb_freq = 1 << (rdft_bits - 1);
993 nb_display_channels = channels;
995 int data_used= s->
show_mode == SHOW_MODE_WAVES ? s->
width : (2*nb_freq);
1007 delay += 2 * data_used;
1008 if (delay < data_used)
1014 for (i = 0; i < 1000; i += channels) {
1021 if (h < score && (b ^ c) < 0) {
1034 SDL_SetRenderDrawColor(
renderer, 255, 255, 255, 255);
1037 h = s->
height / nb_display_channels;
1040 for (ch = 0; ch < nb_display_channels; ch++) {
1042 y1 = s->
ytop + ch * h + (h / 2);
1043 for (x = 0; x < s->
width; x++) {
1058 SDL_SetRenderDrawColor(
renderer, 0, 0, 255, 255);
1060 for (ch = 1; ch < nb_display_channels; ch++) {
1061 y = s->
ytop + ch *
h;
1068 nb_display_channels=
FFMIN(nb_display_channels, 2);
1084 for (ch = 0; ch < nb_display_channels; ch++) {
1087 for (x = 0; x < 2 * nb_freq; x++) {
1088 double w = (x-nb_freq) * (1.0 / nb_freq);
1098 if (!SDL_LockTexture(s->
vis_texture, &rect, (
void **)&pixels, &pitch)) {
1100 pixels += pitch * s->
height;
1101 for (y = 0; y < s->
height; y++) {
1102 double w = 1 / sqrt(nb_freq);
1103 int a = sqrt(w * sqrt(data[0][2 * y + 0] * data[0][2 * y + 0] + data[0][2 * y + 1] * data[0][2 * y + 1]));
1104 int b = (nb_display_channels == 2 ) ? sqrt(w *
hypot(data[1][2 * y + 0], data[1][2 * y + 1]))
1109 *pixels = (a << 16) + (b << 8) + ((a+b) >> 1);
1127 if (stream_index < 0 || stream_index >= ic->
nb_streams)
1224 SDL_DestroyWindow(
window);
1264 int flags = SDL_WINDOW_SHOWN;
1268 flags |= SDL_WINDOW_FULLSCREEN_DESKTOP;
1270 flags |= SDL_WINDOW_BORDERLESS;
1272 flags |= SDL_WINDOW_RESIZABLE;
1273 window = SDL_CreateWindow(
window_title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, w, h, flags);
1274 SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY,
"linear");
1276 SDL_RendererInfo info;
1277 renderer = SDL_CreateRenderer(
window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
1283 if (!SDL_GetRendererInfo(
renderer, &info))
1288 SDL_SetWindowSize(
window, w, h);
1308 SDL_SetRenderDrawColor(
renderer, 0, 0, 0, 255);
1455 double volume_level = is->
audio_volume ? (20 * log(is->
audio_volume / (
double)SDL_MIX_MAXVOLUME) / log(10)) : -1000.0;
1456 int new_volume =
lrint(SDL_MIX_MAXVOLUME * pow(10.0, (volume_level + sign * step) / 20.0));
1470 double sync_threshold,
diff = 0;
1483 if (diff <= -sync_threshold)
1484 delay =
FFMAX(0, delay + diff);
1486 delay = delay +
diff;
1487 else if (diff >= sync_threshold)
1541 double last_duration,
duration, delay;
1564 if (time < is->frame_timer + delay) {
1608 if (!SDL_LockTexture(is->
sub_texture, (SDL_Rect *)sub_rect, (
void **)&pixels, &pitch)) {
1609 for (j = 0; j < sub_rect->
h; j++, pixels += pitch)
1610 memset(pixels, 0, sub_rect->
w << 2);
1635 static int64_t last_time;
1637 int aqsize, vqsize, sqsize;
1641 if (!last_time || (cur_time - last_time) >= 30000) {
1659 "%7.2f %s:%7.3f fd=%4d aq=%5dKB vq=%5dKB sq=%5dB f=%"PRId64
"/%"PRId64
" \r",
1679 #if defined(DEBUG_SYNC)
1680 printf(
"frame_type=%c pts=%0.3f\n",
1750 if (!outputs || !inputs) {
1761 inputs->filter_ctx = sink_ctx;
1762 inputs->pad_idx = 0;
1763 inputs->next =
NULL;
1773 for (i = 0; i < graph->
nb_filters - nb_filters; i++)
1786 char sws_flags_str[512] =
"";
1787 char buffersrc_args[256];
1795 if (!strcmp(e->
key,
"sws_flags")) {
1796 av_strlcatf(sws_flags_str,
sizeof(sws_flags_str),
"%s=%s:",
"flags", e->
value);
1800 if (strlen(sws_flags_str))
1801 sws_flags_str[strlen(sws_flags_str)-1] =
'\0';
1805 snprintf(buffersrc_args,
sizeof(buffersrc_args),
1806 "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
1811 av_strlcatf(buffersrc_args,
sizeof(buffersrc_args),
":frame_rate=%d/%d", fr.
num, fr.
den);
1815 "ffplay_buffer", buffersrc_args,
NULL,
1821 "ffplay_buffersink",
NULL,
NULL, graph);
1828 last_filter = filt_out;
1832 #define INSERT_FILT(name, arg) do { \
1833 AVFilterContext *filt_ctx; \
1835 ret = avfilter_graph_create_filter(&filt_ctx, \
1836 avfilter_get_by_name(name), \
1837 "ffplay_" name, arg, NULL, graph); \
1841 ret = avfilter_link(filt_ctx, 0, last_filter, 0); \
1845 last_filter = filt_ctx; \
1851 if (fabs(theta - 90) < 1.0) {
1852 INSERT_FILT(
"transpose",
"clock");
1853 }
else if (fabs(theta - 180) < 1.0) {
1854 INSERT_FILT(
"hflip",
NULL);
1855 INSERT_FILT(
"vflip",
NULL);
1856 }
else if (fabs(theta - 270) < 1.0) {
1857 INSERT_FILT(
"transpose",
"cclock");
1858 }
else if (fabs(theta) > 1.0) {
1859 char rotate_buf[64];
1860 snprintf(rotate_buf,
sizeof(rotate_buf),
"%f*PI/180", theta);
1861 INSERT_FILT(
"rotate", rotate_buf);
1868 is->in_video_filter = filt_src;
1869 is->out_video_filter = filt_out;
1875 static int configure_audio_filters(
VideoState *is,
const char *afilters,
int force_output_format)
1880 int channels[2] = { 0, -1 };
1882 char aresample_swr_opts[512] =
"";
1884 char asrc_args[256];
1893 if (strlen(aresample_swr_opts))
1894 aresample_swr_opts[strlen(aresample_swr_opts)-1] =
'\0';
1895 av_opt_set(is->agraph,
"aresample_swr_opts", aresample_swr_opts, 0);
1897 ret =
snprintf(asrc_args,
sizeof(asrc_args),
1898 "sample_rate=%d:sample_fmt=%s:channels=%d:time_base=%d/%d",
1900 is->audio_filter_src.channels,
1901 1, is->audio_filter_src.freq);
1902 if (is->audio_filter_src.channel_layout)
1903 snprintf(asrc_args + ret,
sizeof(asrc_args) - ret,
1904 ":channel_layout=0x%"PRIx64, is->audio_filter_src.channel_layout);
1908 asrc_args,
NULL, is->agraph);
1924 if (force_output_format) {
1942 is->in_audio_filter = filt_asrc;
1943 is->out_audio_filter = filt_asink;
1958 int last_serial = -1;
1959 int64_t dec_channel_layout;
1980 cmp_audio_fmts(is->audio_filter_src.fmt, is->audio_filter_src.channels,
1982 is->audio_filter_src.channel_layout != dec_channel_layout ||
1983 is->audio_filter_src.freq != frame->
sample_rate ||
1987 char buf1[1024], buf2[1024];
1991 "Audio frame changed from rate:%d ch:%d fmt:%s layout:%s serial:%d to rate:%d ch:%d fmt:%s layout:%s serial:%d\n",
1992 is->audio_filter_src.freq, is->audio_filter_src.channels,
av_get_sample_fmt_name(is->audio_filter_src.fmt), buf1, last_serial,
1995 is->audio_filter_src.fmt = frame->
format;
1997 is->audio_filter_src.channel_layout = dec_channel_layout;
2001 if ((ret = configure_audio_filters(is, afilters, 1)) < 0)
2066 int last_serial = -1;
2067 int last_vfilter_idx = 0;
2090 if ( last_w != frame->
width
2091 || last_h != frame->
height
2092 || last_format != frame->
format
2094 || last_vfilter_idx != is->vfilter_idx) {
2096 "Video frame changed from size:%dx%d format:%s serial:%d to size:%dx%d format:%s serial:%d\n",
2103 if ((ret = configure_video_filters(graph, is, vfilters_list ? vfilters_list[is->vfilter_idx] :
NULL, frame)) < 0) {
2106 event.user.data1 = is;
2107 SDL_PushEvent(&event);
2110 filt_in = is->in_video_filter;
2111 filt_out = is->out_video_filter;
2112 last_w = frame->
width;
2114 last_format = frame->
format;
2116 last_vfilter_idx = is->vfilter_idx;
2175 if (got_subtitle && sp->
sub.
format == 0) {
2186 }
else if (got_subtitle) {
2198 size = samples_size /
sizeof(short);
2216 int wanted_nb_samples = nb_samples;
2220 double diff, avg_diff;
2221 int min_nb_samples, max_nb_samples;
2238 wanted_nb_samples = av_clip(wanted_nb_samples, min_nb_samples, max_nb_samples);
2241 diff, avg_diff, wanted_nb_samples - nb_samples,
2252 return wanted_nb_samples;
2264 int data_size, resampled_data_size;
2265 int64_t dec_channel_layout;
2267 int wanted_nb_samples;
2290 dec_channel_layout =
2306 "Cannot create sample rate converter for conversion of %d Hz %s %d channels to %d Hz %s %d channels!\n",
2343 if (len2 == out_count) {
2352 resampled_data_size = data_size;
2364 static double last_clock;
2365 printf(
"audio: delay=%0.3f clock=%0.3f clock0=%0.3f\n",
2371 return resampled_data_size;
2378 int audio_size, len1;
2385 if (audio_size < 0) {
2402 memset(stream, 0, len1);
2418 static int audio_open(
void *opaque, int64_t wanted_channel_layout,
int wanted_nb_channels,
int wanted_sample_rate,
struct AudioParams *audio_hw_params)
2420 SDL_AudioSpec wanted_spec, spec;
2422 static const int next_nb_channels[] = {0, 0, 1, 6, 2, 6, 4, 6};
2423 static const int next_sample_rates[] = {0, 44100, 48000, 96000, 192000};
2424 int next_sample_rate_idx =
FF_ARRAY_ELEMS(next_sample_rates) - 1;
2426 env = SDL_getenv(
"SDL_AUDIO_CHANNELS");
2428 wanted_nb_channels = atoi(env);
2436 wanted_spec.channels = wanted_nb_channels;
2437 wanted_spec.freq = wanted_sample_rate;
2438 if (wanted_spec.freq <= 0 || wanted_spec.channels <= 0) {
2442 while (next_sample_rate_idx && next_sample_rates[next_sample_rate_idx] >= wanted_spec.freq)
2443 next_sample_rate_idx--;
2444 wanted_spec.format = AUDIO_S16SYS;
2445 wanted_spec.silence = 0;
2448 wanted_spec.userdata = opaque;
2449 while (SDL_OpenAudio(&wanted_spec, &spec) < 0) {
2451 wanted_spec.channels, wanted_spec.freq, SDL_GetError());
2452 wanted_spec.channels = next_nb_channels[
FFMIN(7, wanted_spec.channels)];
2453 if (!wanted_spec.channels) {
2454 wanted_spec.freq = next_sample_rates[next_sample_rate_idx--];
2455 wanted_spec.channels = wanted_nb_channels;
2456 if (!wanted_spec.freq) {
2458 "No more combinations to try, audio open failed\n");
2464 if (spec.format != AUDIO_S16SYS) {
2466 "SDL advised audio format %d is not supported!\n", spec.format);
2469 if (spec.channels != wanted_spec.channels) {
2471 if (!wanted_channel_layout) {
2473 "SDL advised channel count %d is not supported!\n", spec.channels);
2479 audio_hw_params->
freq = spec.freq;
2481 audio_hw_params->
channels = spec.channels;
2497 const char *forced_codec_name =
NULL;
2501 int64_t channel_layout;
2503 int stream_lowres =
lowres;
2505 if (stream_index < 0 || stream_index >= ic->
nb_streams)
2524 if (forced_codec_name)
2528 "No codec could be found with name '%s'\n", forced_codec_name);
2530 "No codec could be found with id %d\n", avctx->
codec_id);
2578 is->audio_filter_src.channels = avctx->
channels;
2580 is->audio_filter_src.fmt = avctx->
sample_fmt;
2581 if ((ret = configure_audio_filters(is, afilters, 0)) < 0)
2583 sink = is->out_audio_filter;
2658 return stream_id < 0 ||
2672 if(s->
pb && ( !strncmp(s->
filename,
"rtp:", 4)
2673 || !strncmp(s->
filename,
"udp:", 4)
2688 int64_t stream_start_time;
2689 int pkt_in_play_range = 0;
2692 int orig_nb_streams;
2693 SDL_mutex *wait_mutex = SDL_CreateMutex();
2694 int scan_all_pmts_set = 0;
2703 memset(st_index, -1,
sizeof(st_index));
2719 scan_all_pmts_set = 1;
2727 if (scan_all_pmts_set)
2747 for (i = 0; i < orig_nb_streams; i++)
2753 "%s: could not find codec parameters\n", is->
filename);
2800 st_index[i] = INT_MAX;
2812 st_index[AVMEDIA_TYPE_VIDEO],
2818 (st_index[AVMEDIA_TYPE_AUDIO] >= 0 ?
2819 st_index[AVMEDIA_TYPE_AUDIO] :
2820 st_index[AVMEDIA_TYPE_VIDEO]),
2824 if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2828 if (codecpar->
width)
2833 if (st_index[AVMEDIA_TYPE_AUDIO] >= 0) {
2838 if (st_index[AVMEDIA_TYPE_VIDEO] >= 0) {
2842 is->
show_mode = ret >= 0 ? SHOW_MODE_VIDEO : SHOW_MODE_RDFT;
2844 if (st_index[AVMEDIA_TYPE_SUBTITLE] >= 0) {
2855 if (infinite_buffer < 0 && is->realtime)
2868 #if CONFIG_RTSP_DEMUXER || CONFIG_MMSH_PROTOCOL
2879 int64_t seek_target = is->
seek_pos;
2880 int64_t seek_min = is->
seek_rel > 0 ? seek_target - is->
seek_rel + 2: INT64_MIN;
2881 int64_t seek_max = is->
seek_rel < 0 ? seek_target - is->
seek_rel - 2: INT64_MAX;
2888 "%s: error while seeking\n", is->
ic->
filename);
2932 SDL_LockMutex(wait_mutex);
2934 SDL_UnlockMutex(wait_mutex);
2960 SDL_LockMutex(wait_mutex);
2962 SDL_UnlockMutex(wait_mutex);
2971 (pkt_ts - (stream_start_time !=
AV_NOPTS_VALUE ? stream_start_time : 0)) *
2996 event.user.data1 = is;
2997 SDL_PushEvent(&event);
2999 SDL_DestroyMutex(wait_mutex);
3061 int start_index, stream_index;
3077 stream_index = start_index;
3083 for (start_index = 0; start_index <
nb_streams; start_index++)
3086 if (start_index == nb_streams)
3088 stream_index = start_index;
3093 if (++stream_index >= nb_streams)
3101 if (start_index == -1)
3105 if (stream_index == start_index)
3110 switch (codec_type) {
3125 if (p && stream_index != -1)
3147 next = (next + 1) % SHOW_MODE_NB;
3148 }
while (next != is->
show_mode && (next == SHOW_MODE_VIDEO && !is->
video_st || next != SHOW_MODE_VIDEO && !is->
audio_st));
3156 double remaining_time = 0.0;
3158 while (!SDL_PeepEvents(event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT)) {
3163 if (remaining_time > 0.0)
3164 av_usleep((int64_t)(remaining_time * 1000000.0));
3203 double incr, pos, frac;
3208 switch (event.type) {
3214 switch (event.key.keysym.sym) {
3230 case SDLK_KP_MULTIPLY:
3234 case SDLK_KP_DIVIDE:
3257 if (cur_stream->
show_mode == SHOW_MODE_VIDEO && cur_stream->vfilter_idx < nb_vfilters - 1) {
3258 if (++cur_stream->vfilter_idx >= nb_vfilters)
3259 cur_stream->vfilter_idx = 0;
3261 cur_stream->vfilter_idx = 0;
3322 case SDL_MOUSEBUTTONDOWN:
3327 if (event.button.button == SDL_BUTTON_LEFT) {
3328 static int64_t last_mouse_left_click = 0;
3332 last_mouse_left_click = 0;
3337 case SDL_MOUSEMOTION:
3343 if (event.type == SDL_MOUSEBUTTONDOWN) {
3344 if (event.button.button != SDL_BUTTON_RIGHT)
3348 if (!(event.motion.state & SDL_BUTTON_RMASK))
3358 int tns, thh, tmm, tss;
3361 tmm = (tns % 3600) / 60;
3363 frac = x / cur_stream->
width;
3366 mm = (ns % 3600) / 60;
3369 "Seek to %2.0f%% (%2d:%02d:%02d) of total duration (%2d:%02d:%02d) \n", frac*100,
3370 hh, mm, ss, thh, tmm, tss);
3377 case SDL_WINDOWEVENT:
3378 switch (event.window.event) {
3379 case SDL_WINDOWEVENT_RESIZED:
3386 case SDL_WINDOWEVENT_EXPOSED:
3421 if (!file_iformat) {
3436 if (!strcmp(arg,
"audio"))
3438 else if (!strcmp(arg,
"video"))
3440 else if (!strcmp(arg,
"ext"))
3463 show_mode = !strcmp(arg,
"video") ? SHOW_MODE_VIDEO :
3464 !strcmp(arg,
"waves") ? SHOW_MODE_WAVES :
3465 !strcmp(arg,
"rdft" ) ? SHOW_MODE_RDFT :
3474 "Argument '%s' provided as input filename, but '%s' was already specified.\n",
3478 if (!strcmp(filename,
"-"))
3485 const char *spec = strchr(opt,
':');
3488 "No media specifier was specified in '%s' in option '%s'\n",
3499 "Invalid media specifier '%s' in option '%s'\n", spec, opt);
3509 {
"x",
HAS_ARG, { .func_arg =
opt_width },
"force displayed width",
"width" },
3510 {
"y",
HAS_ARG, { .func_arg =
opt_height },
"force displayed height",
"height" },
3519 {
"ss",
HAS_ARG, { .func_arg =
opt_seek },
"seek to a given position in seconds",
"pos" },
3520 {
"t",
HAS_ARG, { .func_arg =
opt_duration },
"play \"duration\" seconds of audio/video",
"duration" },
3532 {
"sync",
HAS_ARG |
OPT_EXPERT, { .func_arg =
opt_sync },
"set audio-video sync. type (type=audio/video/ext)",
"type" },
3541 {
"vf",
OPT_EXPERT |
HAS_ARG, { .func_arg = opt_add_vfilter },
"set video filters",
"filter_graph" },
3542 {
"af",
OPT_STRING |
HAS_ARG, { &afilters },
"set audio filters",
"filter_graph" },
3545 {
"showmode",
HAS_ARG, { .func_arg =
opt_show_mode},
"select show mode (0 = video, 1 = waves, 2 = RDFT)",
"mode" },
3547 {
"i",
OPT_BOOL, { &dummy},
"read specified file",
"input_file"},
3548 {
"codec",
HAS_ARG, { .func_arg =
opt_codec},
"force decoder",
"decoder_name" },
3572 #if !CONFIG_AVFILTER
3577 printf(
"\nWhile playing:\n"
3579 "f toggle full screen\n"
3582 "9, 0 decrease and increase volume respectively\n"
3583 "/, * decrease and increase volume respectively\n"
3584 "a cycle audio channel in the current program\n"
3585 "v cycle video channel\n"
3586 "t cycle subtitle channel in the current program\n"
3588 "w cycle video filters or show modes\n"
3589 "s activate frame-step mode\n"
3590 "left/right seek backward/forward 10 seconds\n"
3591 "down/up seek backward/forward 1 minute\n"
3592 "page down/page up seek backward/forward 10 minutes\n"
3593 "right mouse click seek to percentage in file corresponding to fraction of width\n"
3594 "left double-click toggle full screen\n"
3602 *mtx = SDL_CreateMutex();
3609 return !!SDL_LockMutex(*mtx);
3611 return !!SDL_UnlockMutex(*mtx);
3613 SDL_DestroyMutex(*mtx);
3653 "Use -h to get full help or, even better, run 'man %s'\n",
program_name);
3660 flags = SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER;
3662 flags &= ~SDL_INIT_AUDIO;
3666 if (!SDL_getenv(
"SDL_AUDIO_ALSA_SET_BUFFER_SIZE"))
3667 SDL_setenv(
"SDL_AUDIO_ALSA_SET_BUFFER_SIZE",
"1", 1);
3670 flags &= ~SDL_INIT_VIDEO;
3671 if (SDL_Init (flags)) {
3677 SDL_EventState(SDL_SYSWMEVENT, SDL_IGNORE);
3678 SDL_EventState(SDL_USEREVENT, SDL_IGNORE);
unsigned int nb_chapters
Number of chapters in AVChapter array.
#define EXTERNAL_CLOCK_SPEED_STEP
AVFilterContext ** filters
static void packet_queue_abort(PacketQueue *q)
static int opt_show_mode(void *optctx, const char *opt, const char *arg)
void init_dynload(void)
Initialize dynamic library loading.
static void frame_queue_push(FrameQueue *f)
static void video_image_display(VideoState *is)
const char const char void * val
static void packet_queue_flush(PacketQueue *q)
static int upload_texture(SDL_Texture *tex, AVFrame *frame, struct SwsContext **img_convert_ctx)
static double get_clock(Clock *c)
int64_t avio_size(AVIOContext *s)
Get the filesize.
static int opt_height(void *optctx, const char *opt, const char *arg)
const int program_birth_year
program birth year, defined by the program for show_banner()
static void copy(const float *p1, float *p2, const int length)
int64_t pts_correction_num_faulty_dts
Number of incorrect PTS values so far.
static int audio_open(void *opaque, int64_t wanted_channel_layout, int wanted_nb_channels, int wanted_sample_rate, struct AudioParams *audio_hw_params)
#define EXTERNAL_CLOCK_SPEED_MIN
This structure describes decoded (raw) audio or video data.
#define VIDEO_PICTURE_QUEUE_SIZE
static SDL_Renderer * renderer
int x
top left corner of pict, undefined when pict is not set
AVIOInterruptCB interrupt_callback
Custom interrupt callbacks for the I/O layer.
ptrdiff_t const GLvoid * data
static AVInputFormat * file_iformat
static void opt_input_file(void *optctx, const char *filename)
double get_rotation(AVStream *st)
int av_lockmgr_register(int(*cb)(void **mutex, enum AVLockOp op))
Register a user provided lock manager supporting the operations specified by AVLockOp.
static int opt_format(void *optctx, const char *opt, const char *arg)
AVFilterGraph * avfilter_graph_alloc(void)
Allocate a filter graph.
#define AV_LOG_WARNING
Something somehow does not look correct.
static int get_master_sync_type(VideoState *is)
Main libavfilter public API header.
#define AV_SYNC_FRAMEDUP_THRESHOLD
#define AV_DICT_DONT_OVERWRITE
Don't overwrite existing entries.
static int default_height
Memory buffer source API.
double frame_last_filter_delay
enum VideoState::ShowMode show_mode
int avfilter_graph_config(AVFilterGraph *graphctx, void *log_ctx)
Check validity and configure all the links and formats in the graph.
void avfilter_inout_free(AVFilterInOut **inout)
Free the supplied list of AVFilterInOut and set *inout to NULL.
AVRational sample_aspect_ratio
Video only.
struct AVFilterInOut * next
next input/input in the list, NULL if this is the last
#define av_opt_set_int_list(obj, name, val, term, flags)
Set a binary option to an integer list.
AVRational av_guess_sample_aspect_ratio(AVFormatContext *format, AVStream *stream, AVFrame *frame)
Guess the sample aspect ratio of a frame, based on both the stream and the frame aspect ratio...
static void stream_cycle_channel(VideoState *is, int codec_type)
void av_codec_set_pkt_timebase(AVCodecContext *avctx, AVRational val)
static int opt_frame_pix_fmt(void *optctx, const char *opt, const char *arg)
static void stream_toggle_pause(VideoState *is)
MyAVPacketList * first_pkt
static void stream_seek(VideoState *is, int64_t pos, int64_t rel, int seek_by_bytes)
void avfilter_graph_free(AVFilterGraph **graph)
Free a graph, destroy its links, and set *graph to NULL.
enum AVMediaType codec_type
int64_t bit_rate
Total stream bitrate in bit/s, 0 if not available.
void show_banner(int argc, char **argv, const OptionDef *options)
Print the program banner to stderr.
static int opt_codec(void *optctx, const char *opt, const char *arg)
static AVStream * video_stream
static unsigned sws_flags
AVS_VideoFrame int int int int new_height
attribute_deprecated int avcodec_decode_audio4(AVCodecContext *avctx, AVFrame *frame, int *got_frame_ptr, const AVPacket *avpkt)
Decode the audio frame of size avpkt->size from avpkt->data into frame.
static void set_clock_at(Clock *c, double pts, int serial, double time)
static void toggle_pause(VideoState *is)
double audio_diff_threshold
void av_frame_move_ref(AVFrame *dst, AVFrame *src)
Move everything contained in src to dst and reset src.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int av_usleep(unsigned usec)
Sleep for a period of time.
const AVClass * sws_get_class(void)
Get the AVClass for swsContext.
int avcodec_decode_subtitle2(AVCodecContext *avctx, AVSubtitle *sub, int *got_sub_ptr, AVPacket *avpkt)
Decode a subtitle message.
static const char * audio_codec_name
static void seek_chapter(VideoState *is, int incr)
AVDictionary * filter_codec_opts(AVDictionary *opts, enum AVCodecID codec_id, AVFormatContext *s, AVStream *st, AVCodec *codec)
Filter out options for given codec.
This struct describes the properties of an encoded stream.
AVLockOp
Lock operation used by lockmgr.
char * scale_sws_opts
sws options to use for the auto-inserted scale filters
static VideoState * stream_open(const char *filename, AVInputFormat *iformat)
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
struct SwsContext * img_convert_ctx
static void toggle_audio_display(VideoState *is)
AVRational av_guess_frame_rate(AVFormatContext *ctx, AVStream *stream, AVFrame *frame)
Guess the frame rate, based on both the container and codec information.
memory buffer sink API for audio and video
const AVClass * avcodec_get_class(void)
Get the AVClass for AVCodecContext.
unsigned int nb_stream_indexes
#define AV_LOG_QUIET
Print no output.
int w
width of pict, undefined when pict is not set
static AVFilter ** last_filter
int av_buffersink_get_sample_rate(const AVFilterContext *ctx)
double audio_diff_avg_coef
static int read_thread(void *arg)
int avfilter_link(AVFilterContext *src, unsigned srcpad, AVFilterContext *dst, unsigned dstpad)
Link two filters together.
int swr_set_compensation(struct SwrContext *s, int sample_delta, int compensation_distance)
Activate resampling compensation ("soft" compensation).
static Frame * frame_queue_peek(FrameQueue *f)
static int64_t start_time
enum AVSampleFormat sample_fmt
audio sample format
void log_callback_help(void *ptr, int level, const char *fmt, va_list vl)
Trivial log callback.
AVFrame * av_frame_alloc(void)
Allocate an AVFrame and set its fields to default values.
int opt_default(void *optctx, const char *opt, const char *arg)
Fallback for options that are not explicitly handled, these will be parsed through AVOptions...
8 bits with AV_PIX_FMT_RGB32 palette
static void stream_component_close(VideoState *is, int stream_index)
#define AV_LOG_TRACE
Extremely verbose debugging, useful for libav* development.
static int decode_interrupt_cb(void *ctx)
struct SwrContext * swr_ctx
static av_cold int end(AVCodecContext *avctx)
int64_t duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
static void event_loop(VideoState *cur_stream)
static int cmp_audio_fmts(enum AVSampleFormat fmt1, int64_t channel_count1, enum AVSampleFormat fmt2, int64_t channel_count2)
int avformat_match_stream_specifier(AVFormatContext *s, AVStream *st, const char *spec)
Check if the stream st contained in s is matched by the stream specifier spec.
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
static void packet_queue_destroy(PacketQueue *q)
SDL_Texture * vis_texture
void init_opts(void)
Initialize the cmdutils option system, in particular allocate the *_opts contexts.
AVStream ** streams
A list of all streams in the file.
int avcodec_parameters_to_context(AVCodecContext *codec, const AVCodecParameters *par)
Fill the codec context based on the values from the supplied codec parameters.
void avfilter_register_all(void)
Initialize the filter system.
AVFormatContext * avformat_alloc_context(void)
Allocate an AVFormatContext.
int avfilter_graph_create_filter(AVFilterContext **filt_ctx, const AVFilter *filt, const char *name, const char *args, void *opaque, AVFilterGraph *graph_ctx)
Create and add a filter instance into an existing graph.
void av_codec_set_lowres(AVCodecContext *avctx, int val)
AVRational av_buffersink_get_frame_rate(const AVFilterContext *ctx)
static int64_t audio_callback_time
AVDictionaryEntry * av_dict_get(const AVDictionary *m, const char *key, const AVDictionaryEntry *prev, int flags)
Get a dictionary entry with matching key.
static int64_t get_valid_channel_layout(int64_t channel_layout, int channels)
int flags
Flags modifying the (de)muxer behaviour.
static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block, int *serial)
static void sigterm_handler(int sig)
void parse_options(void *optctx, int argc, char **argv, const OptionDef *options, void(*parse_arg_function)(void *, const char *))
static double av_q2d(AVRational a)
Convert an AVRational to a double.
int avformat_network_init(void)
Do global initialization of network components.
char av_get_picture_type_char(enum AVPictureType pict_type)
Return a single letter to describe the given picture type pict_type.
Frame queue[FRAME_QUEUE_SIZE]
#define AVERROR_EOF
End of file.
#define AV_LOG_VERBOSE
Detailed information.
const AVClass * avformat_get_class(void)
Get the AVClass for AVFormatContext.
void parse_loglevel(int argc, char **argv, const OptionDef *options)
Find the '-loglevel' option in the command line args and apply it.
#define AV_NOSYNC_THRESHOLD
int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame)
Accessors for some AVFrame fields.
int h
height of pict, undefined when pict is not set
static av_always_inline int64_t avio_tell(AVIOContext *s)
ftell() equivalent for AVIOContext.
void show_help_options(const OptionDef *options, const char *msg, int req_flags, int rej_flags, int alt_flags)
Print help for all options matching specified flags.
unsigned int * stream_index
#define AV_OPT_FLAG_ENCODING_PARAM
a generic parameter which can be set by the user for muxing or encoding
AVDictionary ** setup_find_stream_info_opts(AVFormatContext *s, AVDictionary *codec_opts)
Setup AVCodecContext options for avformat_find_stream_info().
AVDictionary * format_opts
static int realloc_texture(SDL_Texture **texture, Uint32 new_format, int new_width, int new_height, SDL_BlendMode blendmode, int init_texture)
static void * av_x_if_null(const void *p, const void *x)
Return x default pointer in case p is NULL.
#define SAMPLE_ARRAY_SIZE
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
Rescale a 64-bit integer by 2 rational numbers.
static void toggle_mute(VideoState *is)
void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output)
Print detailed information about the input or output format, such as duration, bitrate, streams, container, programs, metadata, side data, codec and time base.
Main libavdevice API header.
int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream, AVCodec **decoder_ret, int flags)
Find the "best" stream in the file.
libswresample public header
AVProgram * av_find_program_from_stream(AVFormatContext *ic, AVProgram *last, int s)
Find the programs which belong to a given stream.
int width
width and height of the video frame
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
#define AV_DICT_MATCH_CASE
Only get an entry with exact-case key match.
AVDictionary * metadata
Metadata that applies to the whole file.
static void video_refresh(void *opaque, double *remaining_time)
#define AV_OPT_FLAG_FILTERING_PARAM
a generic parameter which can be set by the user for filtering
int y
top left corner of pict, undefined when pict is not set
static AVStream * audio_stream
static void frame_queue_next(FrameQueue *f)
void av_frame_free(AVFrame **frame)
Free the frame and any dynamically allocated objects in it, e.g.
The libswresample context.
static int decoder_start(Decoder *d, int(*fn)(void *), void *arg)
static int frame_queue_nb_remaining(FrameQueue *f)
packed BGRA 8:8:8:8, 32bpp, BGRABGRA...
#define EXTERNAL_CLOCK_MAX_FRAMES
static int packet_queue_put_nullpacket(PacketQueue *q, int stream_index)
int capabilities
Codec capabilities.
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
#define CURSOR_HIDE_DELAY
int av_read_play(AVFormatContext *s)
Start playing a network-based stream (e.g.
static double compute_target_delay(double delay, VideoState *is)
void av_dict_free(AVDictionary **pm)
Free all the memory allocated for an AVDictionary struct and all keys and values. ...
enum AVMediaType codec_type
General type of the encoded data.
int flags
AV_CODEC_FLAG_*.
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
static int packet_queue_put_private(PacketQueue *q, AVPacket *pkt)
#define AV_LOG_SKIP_REPEATED
Skip repeated messages, this requires the user app to use av_log() instead of (f)printf as the 2 woul...
simple assert() macros that are a bit more flexible than ISO C assert().
static void stream_close(VideoState *is)
static int video_open(VideoState *is)
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
static void init_clock(Clock *c, int *queue_serial)
static enum ShowMode show_mode
New fields can be added to the end with minor version bumps.
static void packet_queue_start(PacketQueue *q)
static const OptionDef options[]
int attribute_align_arg av_buffersink_get_frame_flags(AVFilterContext *ctx, AVFrame *frame, int flags)
Get a frame with filtered data from sink and put it in frame.
uint64_t channel_layout
Audio channel layout.
int av_compare_ts(int64_t ts_a, AVRational tb_a, int64_t ts_b, AVRational tb_b)
Compare two timestamps each in its own time base.
static int opt_sync(void *optctx, const char *opt, const char *arg)
struct SwsContext * sws_getCachedContext(struct SwsContext *context, int srcW, int srcH, enum AVPixelFormat srcFormat, int dstW, int dstH, enum AVPixelFormat dstFormat, int flags, SwsFilter *srcFilter, SwsFilter *dstFilter, const double *param)
Check if context can be reused, otherwise reallocate a new one.
static void update_sample_display(VideoState *is, short *samples, int samples_size)
void av_rdft_calc(RDFTContext *s, FFTSample *data)
uint32_t end_display_time
static void decoder_destroy(Decoder *d)
int64_t pts
Same as packet pts, in AV_TIME_BASE.
static AVPacket flush_pkt
uint64_t channel_layout
Channel layout of the audio data.
double frame_last_returned_time
const AVFilter * avfilter_get_by_name(const char *name)
Get a filter definition matching the given name.
char * av_asprintf(const char *fmt,...)
void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size)
Allocate a buffer, reusing the given one if large enough.
static const char * subtitle_codec_name
static int subtitle_disable
unsigned int nb_streams
Number of elements in AVFormatContext.streams.
static SDL_Window * window
const char program_name[]
program name, defined by the program for show_version().
int av_read_pause(AVFormatContext *s)
Pause a network-based stream (e.g.
static av_const double hypot(double x, double y)
AVInputFormat * av_find_input_format(const char *short_name)
Find AVInputFormat based on the short name of the input format.
#define SAMPLE_QUEUE_SIZE
#define SUBPICTURE_QUEUE_SIZE
enum AVPictureType pict_type
Picture type of the frame.
struct MyAVPacketList * next
#define AV_CH_LAYOUT_STEREO_DOWNMIX
char filename[1024]
input or output filename
#define AV_TIME_BASE
Internal time base represented as integer.
void av_log_set_callback(void(*callback)(void *, int, const char *, va_list))
Set the logging callback.
AVCodecContext * avcodec_alloc_context3(const AVCodec *codec)
Allocate an AVCodecContext and set its fields to default values.
#define AV_OPT_SEARCH_CHILDREN
Search in possible children of the given object first.
static void decoder_init(Decoder *d, AVCodecContext *avctx, PacketQueue *queue, SDL_cond *empty_queue_cond)
static int lockmgr(void **mtx, enum AVLockOp op)
int width
picture width / height.
int main(int argc, char **argv)
static void show_usage(void)
static int opt_width(void *optctx, const char *opt, const char *arg)
static int get_video_frame(VideoState *is, AVFrame *frame)
struct AudioParams audio_src
static void refresh_loop_wait_event(VideoState *is, SDL_Event *event)
static void set_clock_speed(Clock *c, double speed)
#define SDL_AUDIO_MAX_CALLBACKS_PER_SEC
struct SwrContext * swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx)
Allocate SwrContext if needed and set/reset common parameters.
void sws_freeContext(struct SwsContext *swsContext)
Free the swscaler context swsContext.
MyAVPacketList * last_pkt
void av_rdft_end(RDFTContext *s)
static void step_to_next_frame(VideoState *is)
static int audio_decode_frame(VideoState *is)
Decode one audio frame and return its uncompressed size.
RDFTContext * av_rdft_init(int nbits, enum RDFTransformType trans)
Set up a real FFT.
static int is_full_screen
#define AV_SYNC_THRESHOLD_MAX
static void fill_rectangle(int x, int y, int w, int h)
static int stream_has_enough_packets(AVStream *st, int stream_id, PacketQueue *queue)
static const AVFilterPad outputs[]
static int startup_volume
#define SDL_AUDIO_MIN_BUFFER_SIZE
static int packet_queue_init(PacketQueue *q)
uint8_t * data[4]
data+linesize for the bitmap of this subtitle.
static int decoder_reorder_pts
#define AUDIO_DIFF_AVG_NB
static void set_clock(Clock *c, double pts, int serial)
int16_t sample_array[SAMPLE_ARRAY_SIZE]
AVFilterContext * filter_ctx
filter context associated to this input/output
static const char * input_filename
#define FF_ARRAY_ELEMS(a)
static Frame * frame_queue_peek_last(FrameQueue *f)
void show_help_default(const char *opt, const char *arg)
Per-fftool specific help handler.
int av_codec_get_max_lowres(const AVCodec *codec)
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
void avcodec_flush_buffers(AVCodecContext *avctx)
Reset the internal decoder state / flush internal buffers.
const AVClass * avfilter_get_class(void)
A linked-list of the inputs/outputs of the filter chain.
#define SAMPLE_CORRECTION_PERCENT_MAX
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
int avformat_network_deinit(void)
Undo the initialization done by avformat_network_init.
static int opt_duration(void *optctx, const char *opt, const char *arg)
static AVInputFormat * iformat
#define AV_LOG_INFO
Standard information.
static const AVFilterPad inputs[]
char * av_strdup(const char *s)
Duplicate a string.
enum AVMediaType codec_type
static void calculate_display_rect(SDL_Rect *rect, int scr_xleft, int scr_ytop, int scr_width, int scr_height, int pic_width, int pic_height, AVRational pic_sar)
attribute_deprecated int avcodec_decode_video2(AVCodecContext *avctx, AVFrame *picture, int *got_picture_ptr, const AVPacket *avpkt)
Decode the video frame of size avpkt->size from avpkt->data into picture.
AVSampleFormat
Audio sample formats.
void avcodec_free_context(AVCodecContext **avctx)
Free the codec context and everything associated with it and write NULL to the provided pointer...
static void do_exit(VideoState *is)
#define AV_TIME_BASE_Q
Internal time base represented as fractional value.
int sample_rate
samples per second
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
AVIOContext * pb
I/O context.
#define AV_CODEC_FLAG2_FAST
Allow non spec compliant speedup tricks.
static int exit_on_keydown
uint64_t av_buffersink_get_channel_layout(const AVFilterContext *ctx)
main external API structure.
AVCodec * avcodec_find_decoder(enum AVCodecID id)
Find a registered decoder with a matching codec ID.
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
int av_copy_packet(AVPacket *dst, const AVPacket *src)
Copy packet, including contents.
av_cold void swr_free(SwrContext **ss)
Free the given SwrContext and set the pointer to NULL.
double max_frame_duration
void avsubtitle_free(AVSubtitle *sub)
Free all allocated data in the given subtitle struct.
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
int attribute_align_arg sws_scale(struct SwsContext *c, const uint8_t *const srcSlice[], const int srcStride[], int srcSliceY, int srcSliceH, uint8_t *const dst[], const int dstStride[])
swscale wrapper, so we don't need to export the SwsContext.
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(constuint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(constint16_t *) pi >>8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(constint16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(constint32_t *) pi >>24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(constint32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(constfloat *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(constfloat *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(constfloat *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(constdouble *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(constdouble *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(constdouble *) pi *(1U<< 31))))#defineSET_CONV_FUNC_GROUP(ofmt, ifmt) staticvoidset_generic_function(AudioConvert *ac){}voidff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enumAVSampleFormatout_fmt, enumAVSampleFormatin_fmt, intchannels, intsample_rate, intapply_map){AudioConvert *ac;intin_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) returnNULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt)>2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);returnNULL;}returnac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}elseif(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;elseac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);returnac;}intff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){intuse_generic=1;intlen=in->nb_samples;intp;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%dsamples-audio_convert:%sto%s(dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));returnff_convert_dither(ac-> in
static double vp_duration(VideoState *is, Frame *vp, Frame *nextvp)
static const char * window_title
static Frame * frame_queue_peek_next(FrameQueue *f)
static int audio_thread(void *arg)
int av_dict_set(AVDictionary **pm, const char *key, const char *value, int flags)
Set the given entry in *pm, overwriting an existing entry.
static void frame_queue_signal(FrameQueue *f)
static const char * format
static const uint16_t channel_layouts[7]
int sample_rate
Sample rate of the audio data.
int configure_filtergraph(FilterGraph *fg)
int av_frame_get_channels(const AVFrame *frame)
int pad_idx
index of the filt_ctx pad to use for linking
int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
Get the required buffer size for the given audio parameters.
Rational number (pair of numerator and denominator).
#define AV_SYNC_THRESHOLD_MIN
struct SwsContext * sub_convert_ctx
#define AV_OPT_FLAG_DECODING_PARAM
a generic parameter which can be set by the user for demuxing or decoding
int64_t parse_time_or_die(const char *context, const char *timestr, int is_duration)
Parse a string specifying a time and return its corresponding value as a number of microseconds...
static void video_audio_display(VideoState *s)
#define EXTERNAL_CLOCK_SPEED_MAX
static int decoder_decode_frame(Decoder *d, AVFrame *frame, AVSubtitle *sub)
discard useless packets like 0 size packets in avi
size_t av_strlcatf(char *dst, size_t size, const char *fmt,...)
static int is_realtime(AVFormatContext *s)
static void check_external_clock_speed(VideoState *is)
int queue_attachments_req
int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options)
Initialize the AVCodecContext to use the given AVCodec.
static void frame_queue_unref_item(Frame *vp)
int error
contains the error code or 0 if no error happened
int attribute_align_arg swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_count, const uint8_t *in_arg[SWR_CH_MAX], int in_count)
SDL_cond * empty_queue_cond
int av_read_frame(AVFormatContext *s, AVPacket *pkt)
Return the next frame of a stream.
static enum AVPixelFormat pix_fmts[]
int avformat_seek_file(AVFormatContext *s, int stream_index, int64_t min_ts, int64_t ts, int64_t max_ts, int flags)
Seek to timestamp ts.