| OLD | NEW | 
|---|
| 1 /* | 1 /* | 
| 2  * FFplay : Simple Media Player based on the FFmpeg libraries | 2  * FFplay : Simple Media Player based on the FFmpeg libraries | 
| 3  * Copyright (c) 2003 Fabrice Bellard | 3  * Copyright (c) 2003 Fabrice Bellard | 
| 4  * | 4  * | 
| 5  * This file is part of FFmpeg. | 5  * This file is part of FFmpeg. | 
| 6  * | 6  * | 
| 7  * FFmpeg is free software; you can redistribute it and/or | 7  * FFmpeg is free software; you can redistribute it and/or | 
| 8  * modify it under the terms of the GNU Lesser General Public | 8  * modify it under the terms of the GNU Lesser General Public | 
| 9  * License as published by the Free Software Foundation; either | 9  * License as published by the Free Software Foundation; either | 
| 10  * version 2.1 of the License, or (at your option) any later version. | 10  * version 2.1 of the License, or (at your option) any later version. | 
| (...skipping 1737 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1748     return 0; | 1748     return 0; | 
| 1749 } | 1749 } | 
| 1750 | 1750 | 
| 1751 static int input_config_props(AVFilterLink *link) | 1751 static int input_config_props(AVFilterLink *link) | 
| 1752 { | 1752 { | 
| 1753     FilterPriv *priv  = link->src->priv; | 1753     FilterPriv *priv  = link->src->priv; | 
| 1754     AVCodecContext *c = priv->is->video_st->codec; | 1754     AVCodecContext *c = priv->is->video_st->codec; | 
| 1755 | 1755 | 
| 1756     link->w = c->width; | 1756     link->w = c->width; | 
| 1757     link->h = c->height; | 1757     link->h = c->height; | 
|  | 1758     link->time_base = priv->is->video_st->time_base; | 
| 1758 | 1759 | 
| 1759     return 0; | 1760     return 0; | 
| 1760 } | 1761 } | 
| 1761 | 1762 | 
| 1762 static AVFilter input_filter = | 1763 static AVFilter input_filter = | 
| 1763 { | 1764 { | 
| 1764     .name      = "ffplay_input", | 1765     .name      = "ffplay_input", | 
| 1765 | 1766 | 
| 1766     .priv_size = sizeof(FilterPriv), | 1767     .priv_size = sizeof(FilterPriv), | 
| 1767 | 1768 | 
| 1768     .init      = input_init, | 1769     .init      = input_init, | 
| 1769     .uninit    = input_uninit, | 1770     .uninit    = input_uninit, | 
| 1770 | 1771 | 
| 1771     .query_formats = input_query_formats, | 1772     .query_formats = input_query_formats, | 
| 1772 | 1773 | 
| 1773     .inputs    = (AVFilterPad[]) {{ .name = NULL }}, | 1774     .inputs    = (AVFilterPad[]) {{ .name = NULL }}, | 
| 1774     .outputs   = (AVFilterPad[]) {{ .name = "default", | 1775     .outputs   = (AVFilterPad[]) {{ .name = "default", | 
| 1775                                     .type = AVMEDIA_TYPE_VIDEO, | 1776                                     .type = AVMEDIA_TYPE_VIDEO, | 
| 1776                                     .request_frame = input_request_frame, | 1777                                     .request_frame = input_request_frame, | 
| 1777                                     .config_props  = input_config_props, }, | 1778                                     .config_props  = input_config_props, }, | 
| 1778                                   { .name = NULL }}, | 1779                                   { .name = NULL }}, | 
| 1779 }; | 1780 }; | 
| 1780 | 1781 | 
| 1781 static void output_end_frame(AVFilterLink *link) |  | 
| 1782 { |  | 
| 1783 } |  | 
| 1784 |  | 
| 1785 static int output_query_formats(AVFilterContext *ctx) |  | 
| 1786 { |  | 
| 1787     enum PixelFormat pix_fmts[] = { PIX_FMT_YUV420P, PIX_FMT_NONE }; |  | 
| 1788 |  | 
| 1789     avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts)); |  | 
| 1790     return 0; |  | 
| 1791 } |  | 
| 1792 |  | 
| 1793 static int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame, |  | 
| 1794                                     int64_t *pts, int64_t *pos) |  | 
| 1795 { |  | 
| 1796     AVFilterBufferRef *pic; |  | 
| 1797 |  | 
| 1798     if(avfilter_request_frame(ctx->inputs[0])) |  | 
| 1799         return -1; |  | 
| 1800     if(!(pic = ctx->inputs[0]->cur_buf)) |  | 
| 1801         return -1; |  | 
| 1802     ctx->inputs[0]->cur_buf = NULL; |  | 
| 1803 |  | 
| 1804     frame->opaque = pic; |  | 
| 1805     *pts          = pic->pts; |  | 
| 1806     *pos          = pic->pos; |  | 
| 1807 |  | 
| 1808     memcpy(frame->data,     pic->data,     sizeof(frame->data)); |  | 
| 1809     memcpy(frame->linesize, pic->linesize, sizeof(frame->linesize)); |  | 
| 1810 |  | 
| 1811     return 1; |  | 
| 1812 } |  | 
| 1813 |  | 
| 1814 static AVFilter output_filter = |  | 
| 1815 { |  | 
| 1816     .name      = "ffplay_output", |  | 
| 1817 |  | 
| 1818     .query_formats = output_query_formats, |  | 
| 1819 |  | 
| 1820     .inputs    = (AVFilterPad[]) {{ .name          = "default", |  | 
| 1821                                     .type          = AVMEDIA_TYPE_VIDEO, |  | 
| 1822                                     .end_frame     = output_end_frame, |  | 
| 1823                                     .min_perms     = AV_PERM_READ, }, |  | 
| 1824                                   { .name = NULL }}, |  | 
| 1825     .outputs   = (AVFilterPad[]) {{ .name = NULL }}, |  | 
| 1826 }; |  | 
| 1827 #endif  /* CONFIG_AVFILTER */ | 1782 #endif  /* CONFIG_AVFILTER */ | 
| 1828 | 1783 | 
| 1829 static int video_thread(void *arg) | 1784 static int video_thread(void *arg) | 
| 1830 { | 1785 { | 
| 1831     VideoState *is = arg; | 1786     VideoState *is = arg; | 
| 1832     AVFrame *frame= avcodec_alloc_frame(); | 1787     AVFrame *frame= avcodec_alloc_frame(); | 
| 1833     int64_t pts_int; | 1788     int64_t pts_int; | 
| 1834     double pts; | 1789     double pts; | 
| 1835     int ret; | 1790     int ret; | 
| 1836 | 1791 | 
| 1837 #if CONFIG_AVFILTER | 1792 #if CONFIG_AVFILTER | 
| 1838     int64_t pos; | 1793     int64_t pos; | 
| 1839     char sws_flags_str[128]; | 1794     char sws_flags_str[128]; | 
|  | 1795     FFSinkContext ffsink_ctx = { .pix_fmt = PIX_FMT_YUV420P }; | 
| 1840     AVFilterContext *filt_src = NULL, *filt_out = NULL; | 1796     AVFilterContext *filt_src = NULL, *filt_out = NULL; | 
| 1841     AVFilterGraph *graph = av_mallocz(sizeof(AVFilterGraph)); | 1797     AVFilterGraph *graph = av_mallocz(sizeof(AVFilterGraph)); | 
| 1842     snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%d", sws_flags); | 1798     snprintf(sws_flags_str, sizeof(sws_flags_str), "flags=%d", sws_flags); | 
| 1843     graph->scale_sws_opts = av_strdup(sws_flags_str); | 1799     graph->scale_sws_opts = av_strdup(sws_flags_str); | 
| 1844 | 1800 | 
| 1845     if (avfilter_open(&filt_src, &input_filter,  "src") < 0) goto the_end; | 1801     if (avfilter_open(&filt_src, &input_filter,  "src") < 0) goto the_end; | 
| 1846     if (avfilter_open(&filt_out, &output_filter, "out") < 0) goto the_end; | 1802     if (avfilter_open(&filt_out, &ffsink      ,  "out") < 0) goto the_end; | 
| 1847 | 1803 | 
| 1848     if(avfilter_init_filter(filt_src, NULL, is))             goto the_end; | 1804     if(avfilter_init_filter(filt_src, NULL, is))             goto the_end; | 
| 1849     if(avfilter_init_filter(filt_out, NULL, frame))          goto the_end; | 1805     if(avfilter_init_filter(filt_out, NULL, &ffsink_ctx))    goto the_end; | 
| 1850 | 1806 | 
| 1851 | 1807 | 
| 1852     if(vfilters) { | 1808     if(vfilters) { | 
| 1853         AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut)); | 1809         AVFilterInOut *outputs = av_malloc(sizeof(AVFilterInOut)); | 
| 1854         AVFilterInOut *inputs  = av_malloc(sizeof(AVFilterInOut)); | 1810         AVFilterInOut *inputs  = av_malloc(sizeof(AVFilterInOut)); | 
| 1855 | 1811 | 
| 1856         outputs->name    = av_strdup("in"); | 1812         outputs->name    = av_strdup("in"); | 
| 1857         outputs->filter  = filt_src; | 1813         outputs->filter  = filt_src; | 
| 1858         outputs->pad_idx = 0; | 1814         outputs->pad_idx = 0; | 
| 1859         outputs->next    = NULL; | 1815         outputs->next    = NULL; | 
| 1860 | 1816 | 
| 1861         inputs->name    = av_strdup("out"); | 1817         inputs->name    = av_strdup("out"); | 
| 1862         inputs->filter  = filt_out; | 1818         inputs->filter  = filt_out; | 
| 1863         inputs->pad_idx = 0; | 1819         inputs->pad_idx = 0; | 
| 1864         inputs->next    = NULL; | 1820         inputs->next    = NULL; | 
| 1865 | 1821 | 
| 1866         if (avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL) < 0) | 1822         if (avfilter_graph_parse(graph, vfilters, inputs, outputs, NULL) < 0) | 
| 1867             goto the_end; | 1823             goto the_end; | 
| 1868         av_freep(&vfilters); | 1824         av_freep(&vfilters); | 
| 1869     } else { | 1825     } else { | 
| 1870         if(avfilter_link(filt_src, 0, filt_out, 0) < 0)          goto the_end; | 1826         if(avfilter_link(filt_src, 0, filt_out, 0) < 0)          goto the_end; | 
| 1871     } | 1827     } | 
| 1872     avfilter_graph_add_filter(graph, filt_src); | 1828     avfilter_graph_add_filter(graph, filt_src); | 
| 1873     avfilter_graph_add_filter(graph, filt_out); | 1829     avfilter_graph_add_filter(graph, filt_out); | 
| 1874 | 1830 | 
| 1875     if(avfilter_graph_check_validity(graph, NULL))           goto the_end; | 1831     if (avfilter_graph_config(graph, NULL) < 0) | 
| 1876     if(avfilter_graph_config_formats(graph, NULL))           goto the_end; | 1832         goto the_end; | 
| 1877     if(avfilter_graph_config_links(graph, NULL))             goto the_end; |  | 
| 1878 | 1833 | 
| 1879     is->out_video_filter = filt_out; | 1834     is->out_video_filter = filt_out; | 
| 1880 #endif | 1835 #endif | 
| 1881 | 1836 | 
| 1882     for(;;) { | 1837     for(;;) { | 
| 1883 #if !CONFIG_AVFILTER | 1838 #if !CONFIG_AVFILTER | 
| 1884         AVPacket pkt; | 1839         AVPacket pkt; | 
|  | 1840 #else | 
|  | 1841         AVFilterBufferRef *picref; | 
|  | 1842         AVRational tb; | 
| 1885 #endif | 1843 #endif | 
| 1886         while (is->paused && !is->videoq.abort_request) | 1844         while (is->paused && !is->videoq.abort_request) | 
| 1887             SDL_Delay(10); | 1845             SDL_Delay(10); | 
| 1888 #if CONFIG_AVFILTER | 1846 #if CONFIG_AVFILTER | 
| 1889         ret = get_filtered_video_frame(filt_out, frame, &pts_int, &pos); | 1847         ret = get_filtered_video_frame(filt_out, frame, &picref, &tb); | 
|  | 1848         if (picref) { | 
|  | 1849             pts_int = picref->pts; | 
|  | 1850             pos     = picref->pos; | 
|  | 1851             frame->opaque = picref; | 
|  | 1852         } | 
|  | 1853 | 
|  | 1854         if (av_cmp_q(tb, is->video_st->time_base)) { | 
|  | 1855             int64_t pts1 = pts_int; | 
|  | 1856             pts_int = av_rescale_q(pts_int, tb, is->video_st->time_base); | 
|  | 1857             av_log(NULL, AV_LOG_DEBUG, "video_thread(): " | 
|  | 1858                    "tb:%d/%d pts:%"PRId64" -> tb:%d/%d pts:%"PRId64"\n", | 
|  | 1859                    tb.num, tb.den, pts1, | 
|  | 1860                    is->video_st->time_base.num, is->video_st->time_base.den, pts
      _int); | 
|  | 1861         } | 
| 1890 #else | 1862 #else | 
| 1891         ret = get_video_frame(is, frame, &pts_int, &pkt); | 1863         ret = get_video_frame(is, frame, &pts_int, &pkt); | 
| 1892 #endif | 1864 #endif | 
| 1893 | 1865 | 
| 1894         if (ret < 0) goto the_end; | 1866         if (ret < 0) goto the_end; | 
| 1895 | 1867 | 
| 1896         if (!ret) | 1868         if (!ret) | 
| 1897             continue; | 1869             continue; | 
| 1898 | 1870 | 
| 1899         pts = pts_int*av_q2d(is->video_st->time_base); | 1871         pts = pts_int*av_q2d(is->video_st->time_base); | 
| (...skipping 1291 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3191     flush_pkt.data= "FLUSH"; | 3163     flush_pkt.data= "FLUSH"; | 
| 3192 | 3164 | 
| 3193     cur_stream = stream_open(input_filename, file_iformat); | 3165     cur_stream = stream_open(input_filename, file_iformat); | 
| 3194 | 3166 | 
| 3195     event_loop(); | 3167     event_loop(); | 
| 3196 | 3168 | 
| 3197     /* never returns */ | 3169     /* never returns */ | 
| 3198 | 3170 | 
| 3199     return 0; | 3171     return 0; | 
| 3200 } | 3172 } | 
| OLD | NEW | 
|---|