| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Various utilities for command line tools | 2 * Various utilities for command line tools |
| 3 * Copyright (c) 2000-2003 Fabrice Bellard | 3 * Copyright (c) 2000-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 14 matching lines...) Expand all Loading... |
| 25 #include <math.h> | 25 #include <math.h> |
| 26 | 26 |
| 27 /* Include only the enabled headers since some compilers (namely, Sun | 27 /* Include only the enabled headers since some compilers (namely, Sun |
| 28 Studio) will not omit unused inline functions and create undefined | 28 Studio) will not omit unused inline functions and create undefined |
| 29 references to libraries that are not being built. */ | 29 references to libraries that are not being built. */ |
| 30 | 30 |
| 31 #include "config.h" | 31 #include "config.h" |
| 32 #include "libavformat/avformat.h" | 32 #include "libavformat/avformat.h" |
| 33 #include "libavfilter/avfilter.h" | 33 #include "libavfilter/avfilter.h" |
| 34 #include "libavdevice/avdevice.h" | 34 #include "libavdevice/avdevice.h" |
| 35 #if CONFIG_SWSCALE |
| 35 #include "libswscale/swscale.h" | 36 #include "libswscale/swscale.h" |
| 37 #endif |
| 36 #include "libpostproc/postprocess.h" | 38 #include "libpostproc/postprocess.h" |
| 37 #include "libavutil/avstring.h" | 39 #include "libavutil/avstring.h" |
| 38 #include "libavutil/pixdesc.h" | 40 #include "libavutil/pixdesc.h" |
| 39 #include "libavutil/eval.h" | 41 #include "libavutil/eval.h" |
| 40 #include "libavcodec/opt.h" | 42 #include "libavcodec/opt.h" |
| 41 #include "libavcore/avcore.h" | 43 #include "libavcore/avcore.h" |
| 42 #include "cmdutils.h" | 44 #include "cmdutils.h" |
| 43 #include "version.h" | 45 #include "version.h" |
| 44 #if CONFIG_NETWORK | 46 #if CONFIG_NETWORK |
| 45 #include "libavformat/network.h" | 47 #include "libavformat/network.h" |
| 46 #endif | 48 #endif |
| 47 #if HAVE_SYS_RESOURCE_H | 49 #if HAVE_SYS_RESOURCE_H |
| 48 #include <sys/resource.h> | 50 #include <sys/resource.h> |
| 49 #endif | 51 #endif |
| 50 | 52 |
| 51 const char **opt_names; | 53 const char **opt_names; |
| 52 const char **opt_values; | 54 const char **opt_values; |
| 53 static int opt_name_count; | 55 static int opt_name_count; |
| 54 AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; | 56 AVCodecContext *avcodec_opts[AVMEDIA_TYPE_NB]; |
| 55 AVFormatContext *avformat_opts; | 57 AVFormatContext *avformat_opts; |
| 58 #if CONFIG_SWSCALE |
| 56 struct SwsContext *sws_opts; | 59 struct SwsContext *sws_opts; |
| 60 #endif |
| 57 | 61 |
| 58 const int this_year = 2010; | 62 const int this_year = 2010; |
| 59 | 63 |
| 60 void init_opts(void) | 64 void init_opts(void) |
| 61 { | 65 { |
| 62 int i; | 66 int i; |
| 63 for (i = 0; i < AVMEDIA_TYPE_NB; i++) | 67 for (i = 0; i < AVMEDIA_TYPE_NB; i++) |
| 64 avcodec_opts[i] = avcodec_alloc_context2(i); | 68 avcodec_opts[i] = avcodec_alloc_context2(i); |
| 65 avformat_opts = avformat_alloc_context(); | 69 avformat_opts = avformat_alloc_context(); |
| 70 #if CONFIG_SWSCALE |
| 66 sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NUL
L); | 71 sws_opts = sws_getContext(16, 16, 0, 16, 16, 0, SWS_BICUBIC, NULL, NULL, NUL
L); |
| 72 #endif |
| 67 } | 73 } |
| 68 | 74 |
| 69 void uninit_opts(void) | 75 void uninit_opts(void) |
| 70 { | 76 { |
| 71 int i; | 77 int i; |
| 72 for (i = 0; i < AVMEDIA_TYPE_NB; i++) | 78 for (i = 0; i < AVMEDIA_TYPE_NB; i++) |
| 73 av_freep(&avcodec_opts[i]); | 79 av_freep(&avcodec_opts[i]); |
| 74 av_freep(&avformat_opts->key); | 80 av_freep(&avformat_opts->key); |
| 75 av_freep(&avformat_opts); | 81 av_freep(&avformat_opts); |
| 82 #if CONFIG_SWSCALE |
| 76 av_freep(&sws_opts); | 83 av_freep(&sws_opts); |
| 84 #endif |
| 77 } | 85 } |
| 78 | 86 |
| 79 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl) | 87 void log_callback_help(void* ptr, int level, const char* fmt, va_list vl) |
| 80 { | 88 { |
| 81 vfprintf(stdout, fmt, vl); | 89 vfprintf(stdout, fmt, vl); |
| 82 } | 90 } |
| 83 | 91 |
| 84 double parse_number_or_die(const char *context, const char *numstr, int type, do
uble min, double max) | 92 double parse_number_or_die(const char *context, const char *numstr, int type, do
uble min, double max) |
| 85 { | 93 { |
| 86 char *tail; | 94 char *tail; |
| (...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 218 const AVOption *o= NULL; | 226 const AVOption *o= NULL; |
| 219 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT
_FLAG_SUBTITLE_PARAM, 0}; | 227 int opt_types[]={AV_OPT_FLAG_VIDEO_PARAM, AV_OPT_FLAG_AUDIO_PARAM, 0, AV_OPT
_FLAG_SUBTITLE_PARAM, 0}; |
| 220 | 228 |
| 221 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){ | 229 for(type=0; *avcodec_opts && type<AVMEDIA_TYPE_NB && ret>= 0; type++){ |
| 222 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[t
ype], opt_types[type]); | 230 const AVOption *o2 = av_find_opt(avcodec_opts[0], opt, NULL, opt_types[t
ype], opt_types[type]); |
| 223 if(o2) | 231 if(o2) |
| 224 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o); | 232 ret = av_set_string3(avcodec_opts[type], opt, arg, 1, &o); |
| 225 } | 233 } |
| 226 if(!o && avformat_opts) | 234 if(!o && avformat_opts) |
| 227 ret = av_set_string3(avformat_opts, opt, arg, 1, &o); | 235 ret = av_set_string3(avformat_opts, opt, arg, 1, &o); |
| 236 #if CONFIG_SWSCALE |
| 228 if(!o && sws_opts) | 237 if(!o && sws_opts) |
| 229 ret = av_set_string3(sws_opts, opt, arg, 1, &o); | 238 ret = av_set_string3(sws_opts, opt, arg, 1, &o); |
| 239 #endif |
| 230 if(!o){ | 240 if(!o){ |
| 231 if(opt[0] == 'a') | 241 if(opt[0] == 'a') |
| 232 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1
, &o); | 242 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_AUDIO], opt+1, arg, 1
, &o); |
| 233 else if(opt[0] == 'v') | 243 else if(opt[0] == 'v') |
| 234 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1
, &o); | 244 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_VIDEO], opt+1, arg, 1
, &o); |
| 235 else if(opt[0] == 's') | 245 else if(opt[0] == 's') |
| 236 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg
, 1, &o); | 246 ret = av_set_string3(avcodec_opts[AVMEDIA_TYPE_SUBTITLE], opt+1, arg
, 1, &o); |
| 237 } | 247 } |
| 238 if (o && ret < 0) { | 248 if (o && ret < 0) { |
| 239 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt); | 249 fprintf(stderr, "Invalid value '%s' for option '%s'\n", arg, opt); |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 383 } \ | 393 } \ |
| 384 | 394 |
| 385 static void print_all_libs_info(FILE* outstream, int flags) | 395 static void print_all_libs_info(FILE* outstream, int flags) |
| 386 { | 396 { |
| 387 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags); | 397 PRINT_LIB_INFO(outstream, avutil, AVUTIL, flags); |
| 388 PRINT_LIB_INFO(outstream, avcore, AVCORE, flags); | 398 PRINT_LIB_INFO(outstream, avcore, AVCORE, flags); |
| 389 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags); | 399 PRINT_LIB_INFO(outstream, avcodec, AVCODEC, flags); |
| 390 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags); | 400 PRINT_LIB_INFO(outstream, avformat, AVFORMAT, flags); |
| 391 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags); | 401 PRINT_LIB_INFO(outstream, avdevice, AVDEVICE, flags); |
| 392 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags); | 402 PRINT_LIB_INFO(outstream, avfilter, AVFILTER, flags); |
| 403 #if CONFIG_SWSCALE |
| 393 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags); | 404 PRINT_LIB_INFO(outstream, swscale, SWSCALE, flags); |
| 405 #endif |
| 394 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags); | 406 PRINT_LIB_INFO(outstream, postproc, POSTPROC, flags); |
| 395 } | 407 } |
| 396 | 408 |
| 397 void show_banner(void) | 409 void show_banner(void) |
| 398 { | 410 { |
| 399 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmp
eg developers\n", | 411 fprintf(stderr, "%s version " FFMPEG_VERSION ", Copyright (c) %d-%d the FFmp
eg developers\n", |
| 400 program_name, program_birth_year, this_year); | 412 program_name, program_birth_year, this_year); |
| 401 fprintf(stderr, " built on %s %s with %s %s\n", | 413 fprintf(stderr, " built on %s %s with %s %s\n", |
| 402 __DATE__, __TIME__, CC_TYPE, CC_VERSION); | 414 __DATE__, __TIME__, CC_TYPE, CC_VERSION); |
| 403 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n"); | 415 fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n"); |
| (...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 740 ctx->last_pts = reordered_pts; | 752 ctx->last_pts = reordered_pts; |
| 741 } | 753 } |
| 742 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE) | 754 if ((ctx->num_faulty_pts<=ctx->num_faulty_dts || dts == AV_NOPTS_VALUE) |
| 743 && reordered_pts != AV_NOPTS_VALUE) | 755 && reordered_pts != AV_NOPTS_VALUE) |
| 744 pts = reordered_pts; | 756 pts = reordered_pts; |
| 745 else | 757 else |
| 746 pts = dts; | 758 pts = dts; |
| 747 | 759 |
| 748 return pts; | 760 return pts; |
| 749 } | 761 } |
| 762 |
| 763 #if CONFIG_AVFILTER |
| 764 |
| 765 static int ffsink_init(AVFilterContext *ctx, const char *args, void *opaque) |
| 766 { |
| 767 FFSinkContext *priv = ctx->priv; |
| 768 |
| 769 if (!opaque) |
| 770 return AVERROR(EINVAL); |
| 771 *priv = *(FFSinkContext *)opaque; |
| 772 |
| 773 return 0; |
| 774 } |
| 775 |
| 776 static void null_end_frame(AVFilterLink *inlink) { } |
| 777 |
| 778 static int ffsink_query_formats(AVFilterContext *ctx) |
| 779 { |
| 780 FFSinkContext *priv = ctx->priv; |
| 781 enum PixelFormat pix_fmts[] = { priv->pix_fmt, PIX_FMT_NONE }; |
| 782 |
| 783 avfilter_set_common_formats(ctx, avfilter_make_format_list(pix_fmts)); |
| 784 return 0; |
| 785 } |
| 786 |
| 787 AVFilter ffsink = { |
| 788 .name = "ffsink", |
| 789 .priv_size = sizeof(FFSinkContext), |
| 790 .init = ffsink_init, |
| 791 |
| 792 .query_formats = ffsink_query_formats, |
| 793 |
| 794 .inputs = (AVFilterPad[]) {{ .name = "default", |
| 795 .type = AVMEDIA_TYPE_VIDEO, |
| 796 .end_frame = null_end_frame, |
| 797 .min_perms = AV_PERM_READ, }, |
| 798 { .name = NULL }}, |
| 799 .outputs = (AVFilterPad[]) {{ .name = NULL }}, |
| 800 }; |
| 801 |
| 802 int get_filtered_video_frame(AVFilterContext *ctx, AVFrame *frame, |
| 803 AVFilterBufferRef **picref_ptr, AVRational *tb) |
| 804 { |
| 805 int ret; |
| 806 AVFilterBufferRef *picref; |
| 807 |
| 808 if ((ret = avfilter_request_frame(ctx->inputs[0])) < 0) |
| 809 return ret; |
| 810 if (!(picref = ctx->inputs[0]->cur_buf)) |
| 811 return AVERROR(ENOENT); |
| 812 *picref_ptr = picref; |
| 813 ctx->inputs[0]->cur_buf = NULL; |
| 814 *tb = ctx->inputs[0]->time_base; |
| 815 |
| 816 memcpy(frame->data, picref->data, sizeof(frame->data)); |
| 817 memcpy(frame->linesize, picref->linesize, sizeof(frame->linesize)); |
| 818 frame->interlaced_frame = picref->video->interlaced; |
| 819 frame->top_field_first = picref->video->top_field_first; |
| 820 |
| 821 return 1; |
| 822 } |
| 823 |
| 824 #endif /* CONFIG_AVFILTER */ |
| OLD | NEW |