• Home
  • History
  • Annotate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/ap/gpl/minidlna/ffmpeg-2.3.4/

Lines Matching refs:is

4  * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
11 * FFmpeg is distributed in the hope that it will be useful,
75 /* no AV sync correction is done if below the minimum AV sync threshold */
77 /* AV sync correction is done if above the maximum AV sync threshold */
79 /* If a frame duration is longer than this, it will not be duplicated to compensate AV sync */
81 /* no AV correction is done if too big error */
158 int serial; /* clock is based on a packet with this serial */
842 static void video_image_display(VideoState *is)
850 vp = &is->pictq[(is->pictq_rindex + is->pictq_rindex_shown) % VIDEO_PICTURE_QUEUE_SIZE];
852 if (is->subtitle_st) {
853 if (is->subpq_size > 0) {
854 sp = &is->subpq[is->subpq_rindex];
876 calculate_display_rect(&rect, is->xleft, is->ytop, is->width, is->height, vp->width, vp->height, vp->sar);
880 if (rect.x != is->last_display_rect.x || rect.y != is->last_display_rect.y || rect.w != is->last_display_rect.w || rect.h != is->last_display_rect.h || is->force_refresh) {
882 fill_border(is->xleft, is->ytop, is->width, is->height, rect.x, rect.y, rect.w, rect.h, bgcolor, 1);
883 is->last_display_rect = rect;
1011 * directly access it but it is more than fast enough. */
1034 static void stream_close(VideoState *is)
1038 is->abort_request = 1;
1039 SDL_WaitThread(is->read_tid, NULL);
1040 packet_queue_destroy(&is->videoq);
1041 packet_queue_destroy(&is->audioq);
1042 packet_queue_destroy(&is->subtitleq);
1046 free_picture(&is->pictq[i]);
1048 free_subpicture(&is->subpq[i]);
1049 SDL_DestroyMutex(is->pictq_mutex);
1050 SDL_DestroyCond(is->pictq_cond);
1051 SDL_DestroyMutex(is->subpq_mutex);
1052 SDL_DestroyCond(is->subpq_cond);
1053 SDL_DestroyCond(is->continue_read_thread);
1055 sws_freeContext(is->img_convert_ctx);
1057 av_free(is);
1060 static void do_exit(VideoState *is)
1062 if (is) {
1063 stream_close(is);
1091 static int video_open(VideoState *is, int force_set_video_mode, VideoPicture *vp)
1113 if (screen && is->width == screen->w && screen->w == w
1114 && is->height== screen->h && screen->h == h && !force_set_video_mode)
1119 do_exit(is);
1125 is->width = screen->w;
1126 is->height = screen->h;
1132 static void video_display(VideoState *is)
1135 video_open(is, 0, NULL);
1136 if (is->audio_st && is->show_mode != SHOW_MODE_VIDEO)
1137 video_audio_display(is);
1138 else if (is->video_st)
1139 video_image_display(is);
1190 static int get_master_sync_type(VideoState *is) {
1191 if (is->av_sync_type == AV_SYNC_VIDEO_MASTER) {
1192 if (is->video_st)
1196 } else if (is->av_sync_type == AV_SYNC_AUDIO_MASTER) {
1197 if (is->audio_st)
1207 static double get_master_clock(VideoState *is)
1211 switch (get_master_sync_type(is)) {
1213 val = get_clock(&is->vidclk);
1216 val = get_clock(&is->audclk);
1219 val = get_clock(&is->extclk);
1225 static void check_external_clock_speed(VideoState *is) {
1226 if (is->video_stream >= 0 && is->videoq.nb_packets <= MIN_FRAMES / 2 ||
1227 is->audio_stream >= 0 && is->audioq.nb_packets <= MIN_FRAMES / 2) {
1228 set_clock_speed(&is->extclk, FFMAX(EXTERNAL_CLOCK_SPEED_MIN, is->extclk.speed - EXTERNAL_CLOCK_SPEED_STEP));
1229 } else if ((is->video_stream < 0 || is->videoq.nb_packets > MIN_FRAMES * 2) &&
1230 (is->audio_stream < 0 || is->audioq.nb_packets > MIN_FRAMES * 2)) {
1231 set_clock_speed(&is->extclk, FFMIN(EXTERNAL_CLOCK_SPEED_MAX, is->extclk.speed + EXTERNAL_CLOCK_SPEED_STEP));
1233 double speed = is->extclk.speed;
1235 set_clock_speed(&is->extclk, speed + EXTERNAL_CLOCK_SPEED_STEP * (1.0 - speed) / fabs(1.0 - speed));
1240 static void stream_seek(VideoState *is, int64_t pos, int64_t rel, int seek_by_bytes)
1242 if (!is->seek_req) {
1243 is->seek_pos = pos;
1244 is->seek_rel = rel;
1245 is->seek_flags &= ~AVSEEK_FLAG_BYTE;
1247 is->seek_flags |= AVSEEK_FLAG_BYTE;
1248 is->seek_req = 1;
1249 SDL_CondSignal(is->continue_read_thread);
1254 static void stream_toggle_pause(VideoState *is)
1256 if (is->paused) {
1257 is->frame_timer += av_gettime_relative() / 1000000.0 + is->vidclk.pts_drift - is->vidclk.pts;
1258 if (is->read_pause_return != AVERROR(ENOSYS)) {
1259 is->vidclk.paused = 0;
1261 set_clock(&is->vidclk, get_clock(&is->vidclk), is->vidclk.serial);
1263 set_clock(&is->extclk, get_clock(&is->extclk), is->extclk.serial);
1264 is->paused = is->audclk.paused = is->vidclk.paused = is->extclk.paused = !is->paused;
1267 static void toggle_pause(VideoState *is)
1269 stream_toggle_pause(is);
1270 is->step = 0;
1273 static void step_to_next_frame(VideoState *is)
1275 /* if the stream is paused unpause it, then step */
1276 if (is->paused)
1277 stream_toggle_pause(is);
1278 is->step = 1;
1281 static double compute_target_delay(double delay, VideoState *is)
1286 if (get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER) {
1287 /* if video is slave, we try to correct big delays by
1289 diff = get_clock(&is->vidclk) - get_master_clock(is);
1293 if it is the best guess */
1295 if (!isnan(diff) && fabs(diff) < is->max_frame_duration) {
1311 static double vp_duration(VideoState *is, VideoPicture *vp, VideoPicture *nextvp) {
1314 if (isnan(duration) || duration <= 0 || duration > is->max_frame_duration)
1324 static int pictq_nb_remaining(VideoState *is) {
1325 return is->pictq_size - is->pictq_rindex_shown;
1329 static int pictq_prev_picture(VideoState *is) {
1330 int ret = is->pictq_rindex_shown;
1331 is->pictq_rindex_shown = 0;
1335 static void pictq_next_picture(VideoState *is) {
1336 if (!is->pictq_rindex_shown) {
1337 is->pictq_rindex_shown = 1;
1341 if (++is->pictq_rindex == VIDEO_PICTURE_QUEUE_SIZE)
1342 is->pictq_rindex = 0;
1344 SDL_LockMutex(is->pictq_mutex);
1345 is->pictq_size--;
1346 SDL_CondSignal(is->pictq_cond);
1347 SDL_UnlockMutex(is->pictq_mutex);
1350 static void update_video_pts(VideoState *is, double pts, int64_t pos, int serial) {
1352 set_clock(&is->vidclk, pts, serial);
1353 sync_clock_to_slave(&is->extclk, &is->vidclk);
1354 is->video_current_pos = pos;
1360 VideoState *is = opaque;
1365 if (!is->paused && get_master_sync_type(is) == AV_SYNC_EXTERNAL_CLOCK && is->realtime)
1366 check_external_clock_speed(is);
1368 if (!display_disable && is->show_mode != SHOW_MODE_VIDEO && is->audio_st) {
1370 if (is->force_refresh || is->last_vis_time + rdftspeed < time) {
1371 video_display(is);
1372 is->last_vis_time = time;
1374 *remaining_time = FFMIN(*remaining_time, is->last_vis_time + rdftspeed - time);
1377 if (is->video_st) {
1379 if (is->force_refresh)
1380 redisplay = pictq_prev_picture(is);
1382 if (pictq_nb_remaining(is) == 0) {
1389 lastvp = &is->pictq[is->pictq_rindex];
1390 vp = &is->pictq[(is->pictq_rindex + is->pictq_rindex_shown) % VIDEO_PICTURE_QUEUE_SIZE];
1392 if (vp->serial != is->videoq.serial) {
1393 pictq_next_picture(is);
1394 is->video_current_pos = -1;
1400 is->frame_timer = av_gettime_relative() / 1000000.0;
1402 if (is->paused)
1406 last_duration = vp_duration(is, lastvp, vp);
1410 delay = compute_target_delay(last_duration, is);
1413 if (time < is->frame_timer + delay && !redisplay) {
1414 *remaining_time = FFMIN(is->frame_timer + delay - time, *remaining_time);
1418 is->frame_timer += delay;
1419 if (delay > 0 && time - is->frame_timer > AV_SYNC_THRESHOLD_MAX)
1420 is->frame_timer = time;
1422 SDL_LockMutex(is->pictq_mutex);
1424 update_video_pts(is, vp->pts, vp->pos, vp->serial);
1425 SDL_UnlockMutex(is->pictq_mutex);
1427 if (pictq_nb_remaining(is) > 1) {
1428 VideoPicture *nextvp = &is->pictq[(is->pictq_rindex + is->pictq_rindex_shown + 1) % VIDEO_PICTURE_QUEUE_SIZE];
1429 duration = vp_duration(is, vp, nextvp);
1430 if(!is->step && (redisplay || framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
1432 is->frame_drops_late++;
1433 pictq_next_picture(is);
1439 if (is->subtitle_st) {
1440 while (is->subpq_size > 0) {
1441 sp = &is->subpq[is->subpq_rindex];
1443 if (is->subpq_size > 1)
1444 sp2 = &is->subpq[(is->subpq_rindex + 1) % SUBPICTURE_QUEUE_SIZE];
1448 if (sp->serial != is->subtitleq.serial
1449 || (is->vidclk.pts > (sp->pts + ((float) sp->sub.end_display_time / 1000)))
1450 || (sp2 && is->vidclk.pts > (sp2->pts + ((float) sp2->sub.start_display_time / 1000))))
1455 if (++is->subpq_rindex == SUBPICTURE_QUEUE_SIZE)
1456 is->subpq_rindex = 0;
1458 SDL_LockMutex(is->subpq_mutex);
1459 is->subpq_size--;
1460 SDL_CondSignal(is->subpq_cond);
1461 SDL_UnlockMutex(is->subpq_mutex);
1470 if (!display_disable && is->show_mode == SHOW_MODE_VIDEO)
1471 video_display(is);
1473 pictq_next_picture(is);
1475 if (is->step && !is->paused)
1476 stream_toggle_pause(is);
1479 is->force_refresh = 0;
1491 if (is->audio_st)
1492 aqsize = is->audioq.size;
1493 if (is->video_st)
1494 vqsize = is->videoq.size;
1495 if (is->subtitle_st)
1496 sqsize = is->subtitleq.size;
1498 if (is->audio_st && is->video_st)
1499 av_diff = get_clock(&is->audclk) - get_clock(&is->vidclk);
1500 else if (is->video_st)
1501 av_diff = get_master_clock(is) - get_clock(&is->vidclk);
1502 else if (is->audio_st)
1503 av_diff = get_master_clock(is) - get_clock(&is->audclk);
1506 get_master_clock(is),
1507 (is->audio_st && is->video_st) ? "A-V" : (is->video_st ? "M-V" : (is->audio_st ? "M-A" : " ")),
1509 is->frame_drops_early + is->frame_drops_late,
1513 is->video_st ? is->video_st->codec->pts_correction_num_faulty_dts : 0,
1514 is->video_st ? is->video_st->codec->pts_correction_num_faulty_pts : 0);
1523 static void alloc_picture(VideoState *is)
1528 vp = &is->pictq[is->pictq_windex];
1532 video_open(is, 0, vp);
1540 * overlay hardware is unable to support the requested size. */
1545 do_exit(is);
1548 SDL_LockMutex(is->pictq_mutex);
1550 SDL_CondSignal(is->pictq_cond);
1551 SDL_UnlockMutex(is->pictq_mutex);
1572 static int queue_picture(VideoState *is, AVFrame *src_frame, double pts, double duration, int64_t pos, int serial)
1582 SDL_LockMutex(is->pictq_mutex);
1584 while (is->pictq_size >= VIDEO_PICTURE_QUEUE_SIZE &&
1585 !is->videoq.abort_request) {
1586 SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1588 SDL_UnlockMutex(is->pictq_mutex);
1590 if (is->videoq.abort_request)
1593 vp = &is->pictq[is->pictq_windex];
1611 event.user.data1 = is;
1614 /* wait until the picture is allocated */
1615 SDL_LockMutex(is->pictq_mutex);
1616 while (!vp->allocated && !is->videoq.abort_request) {
1617 SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1619 /* if the queue is aborted, we have to pop the pending ALLOC event or wait for the allocation to complete */
1620 if (is->videoq.abort_request && SDL_PeepEvents(&event, 1, SDL_GETEVENT, SDL_EVENTMASK(FF_ALLOC_EVENT)) != 1) {
1621 while (!vp->allocated && !is->abort_request) {
1622 SDL_CondWait(is->pictq_cond, is->pictq_mutex);
1625 SDL_UnlockMutex(is->pictq_mutex);
1627 if (is->videoq.abort_request)
1631 /* if the frame is not skipped, then display it */
1652 is->img_convert_ctx = sws_getCachedContext(is->img_convert_ctx,
1655 if (is->img_convert_ctx == NULL) {
1659 sws_scale(is->img_convert_ctx, src_frame->data, src_frame->linesize,
1673 if (++is->pictq_windex == VIDEO_PICTURE_QUEUE_SIZE)
1674 is->pictq_windex = 0;
1675 SDL_LockMutex(is->pictq_mutex);
1676 is->pictq_size++;
1677 SDL_UnlockMutex(is->pictq_mutex);
1682 static int get_video_frame(VideoState *is, AVFrame *frame, AVPacket *pkt, int *serial)
1686 if (packet_queue_get(&is->videoq, pkt, 1, serial) < 0)
1690 avcodec_flush_buffers(is->video_st->codec);
1694 if(avcodec_decode_video2(is->video_st->codec, frame, &got_picture, pkt) < 0)
1698 is->video_finished = *serial;
1713 dpts = av_q2d(is->video_st->time_base) * frame->pts;
1715 frame->sample_aspect_ratio = av_guess_sample_aspect_ratio(is->ic, is->video_st, frame);
1717 if (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) {
1719 double diff = dpts - get_master_clock(is);
1721 diff - is->frame_last_filter_delay < 0 &&
1722 *serial == is->vidclk.serial &&
1723 is->videoq.nb_packets) {
1724 is->frame_drops_early++;
1780 static int configure_video_filters(AVFilterGraph *graph, VideoState *is, const char *vfilters, AVFrame *frame)
1787 AVCodecContext *codec = is->video_st->codec;
1788 AVRational fr = av_guess_frame_rate(is->ic, is->video_st, NULL);
1797 is->video_st->time_base.num, is->video_st->time_base.den,
1820 * processing order of the filters is in reverse */
1837 /* SDL YUV code is not handling odd width/height for some driver
1842 AVDictionaryEntry *rotate_tag = av_dict_get(is->video_st->metadata, "rotate", NULL, 0);
1862 is->in_video_filter = filt_src;
1863 is->out_video_filter = filt_out;
1869 static int configure_audio_filters(VideoState *is, const char *afilters, int force_output_format)
1881 avfilter_graph_free(&is->agraph);
1882 if (!(is->agraph = avfilter_graph_alloc()))
1889 av_opt_set(is->agraph, "aresample_swr_opts", aresample_swr_opts, 0);
1893 is->audio_filter_src.freq, av_get_sample_fmt_name(is->audio_filter_src.fmt),
1894 is->audio_filter_src.channels,
1895 1, is->audio_filter_src.freq);
1896 if (is->audio_filter_src.channel_layout)
1898 ":channel_layout=0x%"PRIx64, is->audio_filter_src.channel_layout);
1902 asrc_args, NULL, is->agraph);
1909 NULL, NULL, is->agraph);
1919 channel_layouts[0] = is->audio_tgt.channel_layout;
1920 channels [0] = is->audio_tgt.channels;
1921 sample_rates [0] = is->audio_tgt.freq;
1933 if ((ret = configure_filtergraph(is->agraph, afilters, filt_asrc, filt_asink)) < 0)
1936 is->in_audio_filter = filt_asrc;
1937 is->out_audio_filter = filt_asink;
1941 avfilter_graph_free(&is->agraph);
1949 VideoState *is = arg;
1955 AVRational tb = is->video_st->time_base;
1956 AVRational frame_rate = av_guess_frame_rate(is->ic, is->video_st, NULL);
1969 while (is->paused && !is->videoq.abort_request)
1974 ret = get_video_frame(is, frame, &pkt, &serial);
1985 || last_vfilter_idx != is->vfilter_idx) {
1994 if ((ret = configure_video_filters(graph, is, vfilters_list ? vfilters_list[is->vfilter_idx] : NULL, frame)) < 0) {
1997 event.user.data1 = is;
2001 filt_in = is->in_video_filter;
2002 filt_out = is->out_video_filter;
2007 last_vfilter_idx = is->vfilter_idx;
2016 is->frame_last_returned_time = av_gettime_relative() / 1000000.0;
2021 is->video_finished = serial;
2026 is->frame_last_filter_delay = av_gettime_relative() / 1000000.0 - is->frame_last_returned_time;
2027 if (fabs(is->frame_last_filter_delay) > AV_NOSYNC_THRESHOLD / 10.0)
2028 is->frame_last_filter_delay = 0;
2033 ret = queue_picture(is, frame, pts, duration, av_frame_get_pkt_pos(frame), serial);
2053 VideoState *is = arg;
2063 while (is->paused && !is->subtitleq.abort_request) {
2066 if (packet_queue_get(&is->subtitleq, pkt, 1, &serial) < 0)
2070 avcodec_flush_buffers(is->subtitle_st->codec);
2073 SDL_LockMutex(is->subpq_mutex);
2074 while (is->subpq_size >= SUBPICTURE_QUEUE_SIZE &&
2075 !is->subtitleq.abort_request) {
2076 SDL_CondWait(is->subpq_cond, is->subpq_mutex);
2078 SDL_UnlockMutex(is->subpq_mutex);
2080 if (is->subtitleq.abort_request)
2083 sp = &is->subpq[is->subpq_windex];
2085 /* NOTE: ipts is the PTS of the _first_ picture beginning in
2089 pts = av_q2d(is->subtitle_st->time_base) * pkt->pts;
2091 avcodec_decode_subtitle2(is->subtitle_st->codec, &sp->sub,
2112 if (++is->subpq_windex == SUBPICTURE_QUEUE_SIZE)
2113 is->subpq_windex = 0;
2114 SDL_LockMutex(is->subpq_mutex);
2115 is->subpq_size++;
2116 SDL_UnlockMutex(is->subpq_mutex);
2126 static void update_sample_display(VideoState *is, short *samples, int samples_size)
2132 len = SAMPLE_ARRAY_SIZE - is->sample_array_index;
2135 memcpy(is->sample_array + is->sample_array_index, samples, len * sizeof(short));
2137 is->sample_array_index += len;
2138 if (is->sample_array_index >= SAMPLE_ARRAY_SIZE)
2139 is->sample_array_index = 0;
2144 /* return the wanted number of samples to get better sync if sync_type is video
2146 static int synchronize_audio(VideoState *is, int nb_samples)
2151 if (get_master_sync_type(is) != AV_SYNC_AUDIO_MASTER) {
2155 diff = get_clock(&is->audclk) - get_master_clock(is);
2158 is->audio_diff_cum = diff + is->audio_diff_avg_coef * is->audio_diff_cum;
2159 if (is->audio_diff_avg_count < AUDIO_DIFF_AVG_NB) {
2161 is->audio_diff_avg_count++;
2164 avg_diff = is->audio_diff_cum * (1.0 - is->audio_diff_avg_coef);
2166 if (fabs(avg_diff) >= is->audio_diff_threshold) {
2167 wanted_nb_samples = nb_samples + (int)(diff * is->audio_src.freq);
2174 is->audio_clock, is->audio_diff_threshold);
2179 is->audio_diff_avg_count = 0;
2180 is->audio_diff_cum = 0;
2190 * The processed audio frame is decoded, converted if required, and
2191 * stored in is->audio_buf, with size in bytes given by the return
2194 static int audio_decode_frame(VideoState *is)
2196 AVPacket *pkt_temp = &is->audio_pkt_temp;
2197 AVPacket *pkt = &is->audio_pkt;
2198 AVCodecContext *dec = is->audio_st->codec;
2210 while (pkt_temp->stream_index != -1 || is->audio_buf_frames_pending) {
2211 if (!is->frame) {
2212 if (!(is->frame = av_frame_alloc()))
2215 av_frame_unref(is->frame);
2218 if (is->audioq.serial != is->audio_pkt_temp_serial)
2221 if (is->paused)
2224 if (!is->audio_buf_frames_pending) {
2225 len1 = avcodec_decode_audio4(dec, is->frame, &got_frame, pkt_temp);
2239 is->audio_finished = is->audio_pkt_temp_serial;
2244 tb = (AVRational){1, is->frame->sample_rate};
2245 if (is->frame->pts != AV_NOPTS_VALUE)
2246 is->frame->pts = av_rescale_q(is->frame->pts, dec->time_base, tb);
2247 else if (is->frame->pkt_pts != AV_NOPTS_VALUE)
2248 is->frame->pts = av_rescale_q(is->frame->pkt_pts, is->audio_st->time_base, tb);
2249 else if (is->audio_frame_next_pts != AV_NOPTS_VALUE)
2251 is->frame->pts = av_rescale_q(is->audio_frame_next_pts, (AVRational){1, is->audio_filter_src.freq}, tb);
2253 is->frame->pts = av_rescale_q(is->audio_frame_next_pts, (AVRational){1, is->audio_src.freq}, tb);
2256 if (is->frame->pts != AV_NOPTS_VALUE)
2257 is->audio_frame_next_pts = is->frame->pts + is->frame->nb_samples;
2260 dec_channel_layout = get_valid_channel_layout(is->frame->channel_layout, av_frame_get_channels(is->frame));
2263 cmp_audio_fmts(is->audio_filter_src.fmt, is->audio_filter_src.channels,
2264 is->frame->format, av_frame_get_channels(is->frame)) ||
2265 is->audio_filter_src.channel_layout != dec_channel_layout ||
2266 is->audio_filter_src.freq != is->frame->sample_rate ||
2267 is->audio_pkt_temp_serial != is->audio_last_serial;
2271 av_get_channel_layout_string(buf1, sizeof(buf1), -1, is->audio_filter_src.channel_layout);
2275 is->audio_filter_src.freq, is->audio_filter_src.channels, av_get_sample_fmt_name(is->audio_filter_src.fmt), buf1, is->audio_last_serial,
2276 is->frame->sample_rate, av_frame_get_channels(is->frame), av_get_sample_fmt_name(is->frame->format), buf2, is->audio_pkt_temp_serial);
2278 is->audio_filter_src.fmt = is->frame->format;
2279 is->audio_filter_src.channels = av_frame_get_channels(is->frame);
2280 is->audio_filter_src.channel_layout = dec_channel_layout;
2281 is->audio_filter_src.freq = is->frame->sample_rate;
2282 is->audio_last_serial = is->audio_pkt_temp_serial;
2284 if ((ret = configure_audio_filters(is, afilters, 1)) < 0)
2288 if ((ret = av_buffersrc_add_frame(is->in_audio_filter, is->frame)) < 0)
2293 if ((ret = av_buffersink_get_frame_flags(is->out_audio_filter, is->frame, 0)) < 0) {
2295 is->audio_buf_frames_pending = 0;
2299 is->audio_finished = is->audio_pkt_temp_serial;
2302 is->audio_buf_frames_pending = 1;
2303 tb = is->out_audio_filter->inputs[0]->time_base;
2306 data_size = av_samples_get_buffer_size(NULL, av_frame_get_channels(is->frame),
2307 is->frame->nb_samples,
2308 is->frame->format, 1);
2311 (is->frame->channel_layout && av_frame_get_channels(is->frame) == av_get_channel_layout_nb_channels(is->frame->channel_layout)) ?
2312 is->frame->channel_layout : av_get_default_channel_layout(av_frame_get_channels(is->frame));
2313 wanted_nb_samples = synchronize_audio(is, is->frame->nb_samples);
2315 if (is->frame->format != is->audio_src.fmt ||
2316 dec_channel_layout != is->audio_src.channel_layout ||
2317 is->frame->sample_rate != is->audio_src.freq ||
2318 (wanted_nb_samples != is->frame->nb_samples && !is->swr_ctx)) {
2319 swr_free(&is->swr_ctx);
2320 is->swr_ctx = swr_alloc_set_opts(NULL,
2321 is->audio_tgt.channel_layout, is->audio_tgt.fmt, is->audio_tgt.freq,
2322 dec_channel_layout, is->frame->format, is->frame->sample_rate,
2324 if (!is->swr_ctx || swr_init(is->swr_ctx) < 0) {
2327 is->frame->sample_rate, av_get_sample_fmt_name(is->frame->format), av_frame_get_channels(is->frame),
2328 is->audio_tgt.freq, av_get_sample_fmt_name(is->audio_tgt.fmt), is->audio_tgt.channels);
2331 is->audio_src.channel_layout = dec_channel_layout;
2332 is->audio_src.channels = av_frame_get_channels(is->frame);
2333 is->audio_src.freq = is->frame->sample_rate;
2334 is->audio_src.fmt = is->frame->format;
2337 if (is->swr_ctx) {
2338 const uint8_t **in = (const uint8_t **)is->frame->extended_data;
2339 uint8_t **out = &is->audio_buf1;
2340 int out_count = (int64_t)wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate + 256;
2341 int out_size = av_samples_get_buffer_size(NULL, is->audio_tgt.channels, out_count, is->audio_tgt.fmt, 0);
2347 if (wanted_nb_samples != is->frame->nb_samples) {
2348 if (swr_set_compensation(is->swr_ctx, (wanted_nb_samples - is->frame->nb_samples) * is->audio_tgt.freq / is->frame->sample_rate,
2349 wanted_nb_samples * is->audio_tgt.freq / is->frame->sample_rate) < 0) {
2354 av_fast_malloc(&is->audio_buf1, &is->audio_buf1_size, out_size);
2355 if (!is->audio_buf1)
2357 len2 = swr_convert(is->swr_ctx, out, out_count, in, is->frame->nb_samples);
2363 av_log(NULL, AV_LOG_WARNING, "audio buffer is probably too small\n");
2364 swr_init(is->swr_ctx);
2366 is->audio_buf = is->audio_buf1;
2367 resampled_data_size = len2 * is->audio_tgt.channels * av_get_bytes_per_sample(is->audio_tgt.fmt);
2369 is->audio_buf = is->frame->data[0];
2373 audio_clock0 = is->audio_clock;
2375 if (is->frame->pts != AV_NOPTS_VALUE)
2376 is->audio_clock = is->frame->pts * av_q2d(tb) + (double) is->frame->nb_samples / is->frame->sample_rate;
2378 is->audio_clock = NAN;
2379 is->audio_clock_serial = is->audio_pkt_temp_serial;
2384 is->audio_clock - last_clock,
2385 is->audio_clock, audio_clock0);
2386 last_clock = is->audio_clock;
2398 if (is->audioq.abort_request) {
2402 if (is->audioq.nb_packets == 0)
2403 SDL_CondSignal(is->continue_read_thread);
2406 if ((packet_queue_get(&is->audioq, pkt, 1, &is->audio_pkt_temp_serial)) < 0)
2411 is->audio_buf_frames_pending = 0;
2412 is->audio_frame_next_pts = AV_NOPTS_VALUE;
2413 if ((is->ic->iformat->flags & (AVFMT_NOBINSEARCH | AVFMT_NOGENSEARCH | AVFMT_NO_BYTE_SEEK)) && !is->ic->iformat->read_seek)
2414 is->audio_frame_next_pts = is->audio_st->start_time;
2424 VideoState *is = opaque;
2430 if (is->audio_buf_index >= is->audio_buf_size) {
2431 audio_size = audio_decode_frame(is);
2434 is->audio_buf = is->silence_buf;
2435 is->audio_buf_size = sizeof(is->silence_buf) / is->audio_tgt.frame_size * is->audio_tgt.frame_size;
2437 if (is->show_mode != SHOW_MODE_VIDEO)
2438 update_sample_display(is, (int16_t *)is->audio_buf, audio_size);
2439 is->audio_buf_size = audio_size;
2441 is->audio_buf_index = 0;
2443 len1 = is->audio_buf_size - is->audio_buf_index;
2446 memcpy(stream, (uint8_t *)is->audio_buf + is->audio_buf_index, len1);
2449 is->audio_buf_index += len1;
2451 is->audio_write_buf_size = is->audio_buf_size - is->audio_buf_index;
2452 /* Let's assume the audio driver that is used by SDL has two periods. */
2453 if (!isnan(is->audio_clock)) {
2454 set_clock_at(&is->audclk, is->audio_clock - (double)(2 * is->audio_hw_buf_size + is->audio_write_buf_size) / is->audio_tgt.bytes_per_sec, is->audio_clock_serial, audio_callback_time / 1000000.0);
2455 sync_clock_to_slave(&is->extclk, &is->audclk);
2507 "SDL advised audio format %d is not supported!\n", spec.format);
2514 "SDL advised channel count %d is not supported!\n", spec.channels);
2533 static int stream_component_open(VideoState *is, int stream_index)
2535 AVFormatContext *ic = is->ic;
2553 case AVMEDIA_TYPE_AUDIO : is->last_audio_stream = stream_index; forced_codec_name = audio_codec_name; break;
2554 case AVMEDIA_TYPE_SUBTITLE: is->last_subtitle_stream = stream_index; forced_codec_name = subtitle_codec_name; break;
2555 case AVMEDIA_TYPE_VIDEO : is->last_video_stream = stream_index; forced_codec_name = video_codec_name; break;
2570 av_log(avctx, AV_LOG_WARNING, "The maximum value for lowres supported by the decoder is %d\n",
2602 is->audio_filter_src.freq = avctx->sample_rate;
2603 is->audio_filter_src.channels = avctx->channels;
2604 is->audio_filter_src.channel_layout = get_valid_channel_layout(avctx->channel_layout, avctx->channels);
2605 is->audio_filter_src.fmt = avctx->sample_fmt;
2606 if ((ret = configure_audio_filters(is, afilters, 0)) < 0)
2608 link = is->out_audio_filter->inputs[0];
2620 if ((ret = audio_open(is, channel_layout, nb_channels, sample_rate, &is->audio_tgt)) < 0)
2622 is->audio_hw_buf_size = ret;
2623 is->audio_src = is->audio_tgt;
2624 is->audio_buf_size = 0;
2625 is->audio_buf_index = 0;
2628 is->audio_diff_avg_coef = exp(log(0.01) / AUDIO_DIFF_AVG_NB);
2629 is->audio_diff_avg_count = 0;
2632 is->audio_diff_threshold = (double)(is->audio_hw_buf_size) / is->audio_tgt.bytes_per_sec;
2634 memset(&is->audio_pkt, 0, sizeof(is->audio_pkt));
2635 memset(&is->audio_pkt_temp, 0, sizeof(is->audio_pkt_temp));
2636 is->audio_pkt_temp.stream_index = -1;
2638 is->audio_stream = stream_index;
2639 is->audio_st = ic->streams[stream_index];
2641 packet_queue_start(&is->audioq);
2645 is->video_stream = stream_index;
2646 is->video_st = ic->streams[stream_index];
2648 packet_queue_start(&is->videoq);
2649 is->video_tid = SDL_CreateThread(video_thread, is);
2650 is->queue_attachments_req = 1;
2653 is->subtitle_stream = stream_index;
2654 is->subtitle_st = ic->streams[stream_index];
2655 packet_queue_start(&is->subtitleq);
2657 is->subtitle_tid = SDL_CreateThread(subtitle_thread, is);
2665 static void stream_component_close(VideoState *is, int stream_index)
2667 AVFormatContext *ic = is->ic;
2676 packet_queue_abort(&is->audioq);
2680 packet_queue_flush(&is->audioq);
2681 av_free_packet(&is->audio_pkt);
2682 swr_free(&is->swr_ctx);
2683 av_freep(&is->audio_buf1);
2684 is->audio_buf1_size = 0;
2685 is->audio_buf = NULL;
2686 av_frame_free(&is->frame);
2688 if (is->rdft) {
2689 av_rdft_end(is->rdft);
2690 av_freep(&is->rdft_data);
2691 is->rdft = NULL;
2692 is->rdft_bits = 0;
2695 avfilter_graph_free(&is->agraph);
2699 packet_queue_abort(&is->videoq);
2703 SDL_LockMutex(is->pictq_mutex);
2704 SDL_CondSignal(is->pictq_cond);
2705 SDL_UnlockMutex(is->pictq_mutex);
2707 SDL_WaitThread(is->video_tid, NULL);
2709 packet_queue_flush(&is->videoq);
2712 packet_queue_abort(&is->subtitleq);
2716 SDL_LockMutex(is->subpq_mutex);
2717 SDL_CondSignal(is->subpq_cond);
2718 SDL_UnlockMutex(is->subpq_mutex);
2720 SDL_WaitThread(is->subtitle_tid, NULL);
2722 packet_queue_flush(&is->subtitleq);
2732 is->audio_st = NULL;
2733 is->audio_stream = -1;
2736 is->video_st = NULL;
2737 is->video_stream = -1;
2740 is->subtitle_st = NULL;
2741 is->subtitle_stream = -1;
2750 VideoState *is = ctx;
2751 return is->abort_request;
2773 VideoState *is = arg;
2787 is->last_video_stream = is->video_stream = -1;
2788 is->last_audio_stream = is->audio_stream = -1;
2789 is->last_subtitle_stream = is->subtitle_stream = -1;
2793 ic->interrupt_callback.opaque = is;
2794 err = avformat_open_input(&ic, is->filename, is->iformat, &format_opts);
2796 print_error(is->filename, err);
2805 is->ic = ic;
2818 "%s: could not find codec parameters\n", is->filename);
2832 is->max_frame_duration = (ic->iformat->flags & AVFMT_TS_DISCONT) ? 10.0 : 3600.0;
2848 is->filename, (double)timestamp / AV_TIME_BASE);
2852 is->realtime = is_realtime(ic);
2875 av_dump_format(ic, 0, is->filename, 0);
2878 is->show_mode = show_mode;
2889 stream_component_open(is, st_index[AVMEDIA_TYPE_AUDIO]);
2894 ret = stream_component_open(is, st_index[AVMEDIA_TYPE_VIDEO]);
2896 if (is->show_mode == SHOW_MODE_NONE)
2897 is->show_mode = ret >= 0 ? SHOW_MODE_VIDEO : SHOW_MODE_RDFT;
2900 stream_component_open(is, st_index[AVMEDIA_TYPE_SUBTITLE]);
2903 if (is->video_stream < 0 && is->audio_stream < 0) {
2905 is->filename);
2910 if (infinite_buffer < 0 && is->realtime)
2914 if (is->abort_request)
2916 if (is->paused != is->last_paused) {
2917 is->last_paused = is->paused;
2918 if (is->paused)
2919 is->read_pause_return = av_read_pause(ic);
2924 if (is->paused &&
2933 if (is->seek_req) {
2934 int64_t seek_target = is->seek_pos;
2935 int64_t seek_min = is->seek_rel > 0 ? seek_target - is->seek_rel + 2: INT64_MIN;
2936 int64_t seek_max = is->seek_rel < 0 ? seek_target - is->seek_rel - 2: INT64_MAX;
2937 // FIXME the +-2 is due to rounding being not done in the correct direction in generation
2940 ret = avformat_seek_file(is->ic, -1, seek_min, seek_target, seek_max, is->seek_flags);
2943 "%s: error while seeking\n", is->ic->filename);
2945 if (is->audio_stream >= 0) {
2946 packet_queue_flush(&is->audioq);
2947 packet_queue_put(&is->audioq, &flush_pkt);
2949 if (is->subtitle_stream >= 0) {
2950 packet_queue_flush(&is->subtitleq);
2951 packet_queue_put(&is->subtitleq, &flush_pkt);
2953 if (is->video_stream >= 0) {
2954 packet_queue_flush(&is->videoq);
2955 packet_queue_put(&is->videoq, &flush_pkt);
2957 if (is->seek_flags & AVSEEK_FLAG_BYTE) {
2958 set_clock(&is->extclk, NAN, 0);
2960 set_clock(&is->extclk, seek_target / (double)AV_TIME_BASE, 0);
2963 is->seek_req = 0;
2964 is->queue_attachments_req = 1;
2966 if (is->paused)
2967 step_to_next_frame(is);
2969 if (is->queue_attachments_req) {
2970 if (is->video_st && is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC) {
2972 if ((ret = av_copy_packet(&copy, &is->video_st->attached_pic)) < 0)
2974 packet_queue_put(&is->videoq, &copy);
2975 packet_queue_put_nullpacket(&is->videoq, is->video_stream);
2977 is->queue_attachments_req = 0;
2982 (is->audioq.size + is->videoq.size + is->subtitleq.size > MAX_QUEUE_SIZE
2983 || ( (is->audioq .nb_packets > MIN_FRAMES || is->audio_stream < 0 || is->audioq.abort_request)
2984 && (is->videoq .nb_packets > MIN_FRAMES || is->video_stream < 0 || is->videoq.abort_request
2985 || (is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC))
2986 && (is->subtitleq.nb_packets > MIN_FRAMES || is->subtitle_stream < 0 || is->subtitleq.abort_request)))) {
2989 SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
2993 if (!is->paused &&
2994 (!is->audio_st || is->audio_finished == is->audioq.serial) &&
2995 (!is->video_st || (is->video_finished == is->videoq.serial && pictq_nb_remaining(is) == 0))) {
2997 stream_seek(is, start_time != AV_NOPTS_VALUE ? start_time : 0, 0, 0);
3004 if (is->video_stream >= 0)
3005 packet_queue_put_nullpacket(&is->videoq, is->video_stream);
3006 if (is->audio_stream >= 0)
3007 packet_queue_put_nullpacket(&is->audioq, is->audio_stream);
3008 if (is->subtitle_stream >= 0)
3009 packet_queue_put_nullpacket(&is->subtitleq, is->subtitle_stream);
3021 SDL_CondWaitTimeout(is->continue_read_thread, wait_mutex, 10);
3025 /* check if packet is in play range specified by user, then queue, otherwise discard */
3032 if (pkt->stream_index == is->audio_stream && pkt_in_play_range) {
3033 packet_queue_put(&is->audioq, pkt);
3034 } else if (pkt->stream_index == is->video_stream && pkt_in_play_range
3035 && !(is->video_st->disposition & AV_DISPOSITION_ATTACHED_PIC)) {
3036 packet_queue_put(&is->videoq, pkt);
3037 } else if (pkt->stream_index == is->subtitle_stream && pkt_in_play_range) {
3038 packet_queue_put(&is->subtitleq, pkt);
3044 while (!is->abort_request) {
3051 if (is->audio_stream >= 0)
3052 stream_component_close(is, is->audio_stream);
3053 if (is->video_stream >= 0)
3054 stream_component_close(is, is->video_stream);
3055 if (is->subtitle_stream >= 0)
3056 stream_component_close(is, is->subtitle_stream);
3057 if (is->ic) {
3058 avformat_close_input(&is->ic);
3065 event.user.data1 = is;
3074 VideoState *is;
3076 is = av_mallocz(sizeof(VideoState));
3077 if (!is)
3079 av_strlcpy(is->filename, filename, sizeof(is->filename));
3080 is->iformat = iformat;
3081 is->ytop = 0;
3082 is->xleft = 0;
3085 is->pictq_mutex = SDL_CreateMutex();
3086 is->pictq_cond = SDL_CreateCond();
3088 is->subpq_mutex = SDL_CreateMutex();
3089 is->subpq_cond = SDL_CreateCond();
3091 packet_queue_init(&is->videoq);
3092 packet_queue_init(&is->audioq);
3093 packet_queue_init(&is->subtitleq);
3095 is->continue_read_thread = SDL_CreateCond();
3097 init_clock(&is->vidclk, &is->videoq.serial);
3098 init_clock(&is->audclk, &is->audioq.serial);
3099 init_clock(&is->extclk, &is->extclk.serial);
3100 is->audio_clock_serial = -1;
3101 is->audio_last_serial = -1;
3102 is->av_sync_type = av_sync_type;
3103 is->read_tid = SDL_CreateThread(read_thread, is);
3104 if (!is->read_tid) {
3105 av_free(is);
3108 return is;
3111 static void stream_cycle_channel(VideoState *is, int codec_type)
3113 AVFormatContext *ic = is->ic;
3118 int nb_streams = is->ic->nb_streams;
3121 start_index = is->last_video_stream;
3122 old_index = is->video_stream;
3124 start_index = is->last_audio_stream;
3125 old_index = is->audio_stream;
3127 start_index = is->last_subtitle_stream;
3128 old_index = is->subtitle_stream;
3132 if (codec_type != AVMEDIA_TYPE_VIDEO && is->video_stream != -1) {
3133 p = av_find_program_from_stream(ic, NULL, is->video_stream);
3151 is->last_subtitle_stream = -1;
3160 st = is->ic->streams[p ? p->stream_index[stream_index] : stream_index];
3185 stream_component_close(is, old_index);
3186 stream_component_open(is, stream_index);
3190 static void toggle_full_screen(VideoState *is)
3196 is->pictq[i].reallocate = 1;
3199 video_open(is, 1, NULL);
3202 static void toggle_audio_display(VideoState *is)
3205 int next = is->show_mode;
3208 } while (next != is->show_mode && (next == SHOW_MODE_VIDEO && !is->video_st || next != SHOW_MODE_VIDEO && !is->audio_st));
3209 if (is->show_mode != next) {
3211 is->xleft, is->ytop, is->width, is->height,
3213 is->force_refresh = 1;
3214 is->show_mode = next;
3218 static void refresh_loop_wait_event(VideoState *is, SDL_Event *event) {
3229 if (is->show_mode != SHOW_MODE_NONE && (!is->paused || is->force_refresh))
3230 video_refresh(is, &remaining_time);
3235 static void seek_chapter(VideoState *is, int incr)
3237 int64_t pos = get_master_clock(is) * AV_TIME_BASE;
3240 if (!is->ic->nb_chapters)
3244 for (i = 0; i < is->ic->nb_chapters; i++) {
3245 AVChapter *ch = is->ic->chapters[i];
3254 if (i >= is->ic->nb_chapters)
3258 stream_seek(is, av_rescale_q(is->ic->chapters[i]->start, is->ic->chapters[i]->time_base,
3445 av_log(NULL, AV_LOG_WARNING, "Option -s is deprecated, use -video_size.\n");
3473 av_log(NULL, AV_LOG_WARNING, "Option -pix_fmt is deprecated, use -pixel_format.\n");
3579 { "framedrop", OPT_BOOL | OPT_EXPERT, { &framedrop }, "drop frames when cpu is too slow", "" },
3659 VideoState *is;
3727 is = stream_open(input_filename, file_iformat);
3728 if (!is) {
3733 event_loop(is);