X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffmpeg.c;h=1146666b2302a8379516c257cb39b237859ae0b6;hb=9076fee4f5268e5874ac15e2d0013828e322aac4;hp=0287a15700acd453f3b9d7834998fcd41f660a61;hpb=58f7833e8e5972e5021319ae26b5a82d01a11be7;p=ffmpeg diff --git a/ffmpeg.c b/ffmpeg.c index 0287a15700a..1146666b230 100644 --- a/ffmpeg.c +++ b/ffmpeg.c @@ -14,7 +14,7 @@ * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ #define HAVE_AV_CONFIG_H #include @@ -213,8 +213,12 @@ static int rate_emu = 0; #ifdef CONFIG_BKTR static char *video_grab_format = "bktr"; #else +#ifdef CONFIG_VIDEO4LINUX2 +static char *video_grab_format = "video4linux2"; +#else static char *video_grab_format = "video4linux"; #endif +#endif static char *video_device = NULL; static char *grab_device = NULL; static int video_channel = 0; @@ -239,6 +243,7 @@ static int input_sync; static int limit_filesize = 0; // static int pgmyuv_compatibility_hack=0; +static int dts_delta_threshold = 10; const char **opt_names=NULL; int opt_name_count=0; @@ -621,13 +626,7 @@ static void pre_process_video_frame(AVInputStream *ist, AVPicture *picture, void picture2 = picture; } } else { - if (img_convert(picture2, dec->pix_fmt, picture, - dec->pix_fmt, dec->width, dec->height) < 0) { - /* if error, do not copy */ - av_free(buf); - buf = NULL; - picture2 = picture; - } + img_copy(picture2, picture, dec->pix_fmt, dec->width, dec->height); } } else { picture2 = picture; @@ -843,20 +842,10 @@ static void do_video_out(AVFormatContext *s, } } } else if (ost->video_crop) { - picture_crop_temp.data[0] = formatted_picture->data[0] + - (ost->topBand * formatted_picture->linesize[0]) + ost->leftBand; - - picture_crop_temp.data[1] = formatted_picture->data[1] + - ((ost->topBand >> 1) * formatted_picture->linesize[1]) + - (ost->leftBand >> 1); - - picture_crop_temp.data[2] = formatted_picture->data[2] + - ((ost->topBand >> 1) * formatted_picture->linesize[2]) + - (ost->leftBand >> 1); - - picture_crop_temp.linesize[0] = formatted_picture->linesize[0]; - picture_crop_temp.linesize[1] = formatted_picture->linesize[1]; - picture_crop_temp.linesize[2] = formatted_picture->linesize[2]; + if (img_crop((AVPicture *)&picture_crop_temp, (AVPicture *)formatted_picture, enc->pix_fmt, ost->topBand, ost->leftBand) < 0) { + av_log(NULL, AV_LOG_ERROR, "error cropping picture\n"); + goto the_end; + } final_picture = &picture_crop_temp; } else if (ost->video_pad) { final_picture = &ost->pict_tmp; @@ -1172,7 +1161,7 @@ static int output_packet(AVInputStream *ist, int ist_index, int data_size, got_picture; AVFrame picture; void *buffer_to_free; - static int samples_size= 0; + static unsigned int samples_size= 0; static short *samples= NULL; AVSubtitle subtitle, *subtitle_to_free; int got_subtitle; @@ -1657,6 +1646,7 @@ static int av_encode(AVFormatContext **output_files, codec->block_align= icodec->block_align; break; case CODEC_TYPE_VIDEO: + codec->pix_fmt = icodec->pix_fmt; codec->width = icodec->width; codec->height = icodec->height; codec->has_b_frames = icodec->has_b_frames; @@ -1724,8 +1714,8 @@ static int av_encode(AVFormatContext **output_files, } else if ((codec->width == icodec->width - (frame_leftBand + frame_rightBand)) && (codec->height == icodec->height - - (frame_topBand + frame_bottomBand))) - { + (frame_topBand + frame_bottomBand)) && + (frame_rightBand + frame_leftBand + frame_topBand + frame_bottomBand)) { ost->video_resample = 0; ost->video_crop = 1; ost->topBand = frame_topBand; @@ -1733,7 +1723,8 @@ static int av_encode(AVFormatContext **output_files, } else if ((codec->width == icodec->width + (frame_padleft + frame_padright)) && (codec->height == icodec->height + - (frame_padtop + frame_padbottom))) { + (frame_padtop + frame_padbottom)) && + (frame_padright + frame_padleft + frame_padtop + frame_padbottom)) { ost->video_resample = 0; ost->video_crop = 0; ost->video_pad = 1; @@ -2051,7 +2042,7 @@ static int av_encode(AVFormatContext **output_files, // fprintf(stderr, "next:%lld dts:%lld off:%lld %d\n", ist->next_pts, pkt.dts, input_files_ts_offset[ist->file_index], ist->st->codec->codec_type); if (pkt.dts != AV_NOPTS_VALUE && ist->next_pts != AV_NOPTS_VALUE) { int64_t delta= av_rescale_q(pkt.dts, ist->st->time_base, AV_TIME_BASE_Q) - ist->next_pts; - if(ABS(delta) > 10LL*AV_TIME_BASE && !copy_ts){ + if(ABS(delta) > 1LL*dts_delta_threshold*AV_TIME_BASE && !copy_ts){ input_files_ts_offset[ist->file_index]-= delta; if (verbose > 2) fprintf(stderr, "timestamp discontinuity %"PRId64", new offset= %"PRId64"\n", delta, input_files_ts_offset[ist->file_index]); @@ -3581,6 +3572,7 @@ static void prepare_grab(void) vp->device = video_device; vp->channel = video_channel; vp->standard = video_standard; + vp->pix_fmt = frame_pix_fmt; if (av_open_input_file(&ic, "", fmt1, 0, vp) < 0) { fprintf(stderr, "Could not find video grab device\n"); exit(1); @@ -3789,7 +3781,7 @@ static void show_formats(void) exit(1); } -void parse_matrix_coeffs(uint16_t *dest, const char *str) +static void parse_matrix_coeffs(uint16_t *dest, const char *str) { int i; const char *p = str; @@ -3806,13 +3798,13 @@ void parse_matrix_coeffs(uint16_t *dest, const char *str) } } -void opt_inter_matrix(const char *arg) +static void opt_inter_matrix(const char *arg) { inter_matrix = av_mallocz(sizeof(uint16_t) * 64); parse_matrix_coeffs(inter_matrix, arg); } -void opt_intra_matrix(const char *arg) +static void opt_intra_matrix(const char *arg) { intra_matrix = av_mallocz(sizeof(uint16_t) * 64); parse_matrix_coeffs(intra_matrix, arg); @@ -3944,11 +3936,13 @@ static void opt_target(const char *arg) audio_bit_rate = 448000; audio_sample_rate = 48000; - } else if(!strcmp(arg, "dv")) { + } else if(!strncmp(arg, "dv", 2)) { opt_format("dv"); opt_frame_size(norm ? "720x480" : "720x576"); + opt_frame_pix_fmt(!strncmp(arg, "dv50", 4) ? "yuv422p" : + (norm ? "yuv411p" : "yuv420p")); opt_frame_rate(frame_rates[norm]); audio_sample_rate = 48000; @@ -3962,10 +3956,12 @@ static void opt_target(const char *arg) static void show_version(void) { + /* TODO: add function interface to avutil and avformat */ fprintf(stderr, "ffmpeg " FFMPEG_VERSION "\n" + "libavutil %d\n" "libavcodec %d\n" "libavformat %d\n", - avcodec_build(), LIBAVFORMAT_BUILD); + LIBAVUTIL_BUILD, avcodec_build(), LIBAVFORMAT_BUILD); exit(1); } @@ -4017,16 +4013,17 @@ const OptionDef options[] = { { "hex", OPT_BOOL | OPT_EXPERT, {(void*)&do_hex_dump}, "when dumping packets, also dump the payload" }, { "re", OPT_BOOL | OPT_EXPERT, {(void*)&rate_emu}, "read input at native frame rate", "" }, - { "loop", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" }, + { "loop_input", OPT_BOOL | OPT_EXPERT, {(void*)&loop_input}, "loop (current only works with images)" }, { "loop_output", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&loop_output}, "number of times to loop output in formats that support looping (0 loops forever)", "" }, { "v", HAS_ARG, {(void*)opt_verbose}, "control amount of logging", "verbose" }, - { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" }, + { "target", HAS_ARG, {(void*)opt_target}, "specify target file type (\"vcd\", \"svcd\", \"dvd\", \"dv\", \"dv50\", \"pal-vcd\", \"ntsc-svcd\", ...)", "type" }, { "threads", HAS_ARG | OPT_EXPERT, {(void*)opt_thread_count}, "thread count", "count" }, { "vsync", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_sync_method}, "video sync method", "" }, { "async", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&audio_sync_method}, "audio sync method", "" }, { "vglobal", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&video_global_header}, "video global header storage type", "" }, { "copyts", OPT_BOOL | OPT_EXPERT, {(void*)©_ts}, "copy timestamps" }, { "shortest", OPT_BOOL | OPT_EXPERT, {(void*)&opt_shortest}, "finish encoding within shortest input" }, // + { "dts_delta_threshold", HAS_ARG | OPT_INT | OPT_EXPERT, {(void*)&dts_delta_threshold}, "timestamp discontinuity delta threshold", "" }, /* video options */ { "b", HAS_ARG | OPT_VIDEO, {(void*)opt_video_bitrate}, "set video bitrate (in kbit/s)", "bitrate" }, @@ -4147,12 +4144,14 @@ const OptionDef options[] = { static void show_banner(void) { - fprintf(stderr, "ffmpeg version " FFMPEG_VERSION ", build %d, Copyright (c) 2000-2004 Fabrice Bellard\n", - LIBAVCODEC_BUILD); - fprintf(stderr, " configuration: %s\n", FFMPEG_CONFIGURATION); + fprintf(stderr, "FFmpeg version " FFMPEG_VERSION ", Copyright (c) 2000-2004 Fabrice Bellard\n"); + fprintf(stderr, " configuration: " FFMPEG_CONFIGURATION "\n"); + fprintf(stderr, " libavutil version: " AV_STRINGIFY(LIBAVUTIL_VERSION) "\n"); + fprintf(stderr, " libavcodec version: " AV_STRINGIFY(LIBAVCODEC_VERSION) "\n"); + fprintf(stderr, " libavformat version: " AV_STRINGIFY(LIBAVFORMAT_VERSION) "\n"); fprintf(stderr, " built on " __DATE__ " " __TIME__); #ifdef __GNUC__ - fprintf(stderr, ", gcc: %s\n", __VERSION__); + fprintf(stderr, ", gcc: " __VERSION__ "\n"); #else fprintf(stderr, ", using a non-gcc compiler\n"); #endif @@ -4175,7 +4174,7 @@ static void show_license(void) "\n" "You should have received a copy of the GNU General Public License\n" "along with this program; if not, write to the Free Software\n" - "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" + "Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\n" ); #else printf( @@ -4191,7 +4190,7 @@ static void show_license(void) "\n" "You should have received a copy of the GNU Lesser General Public\n" "License along with this library; if not, write to the Free Software\n" - "Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\n" + "Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" ); #endif exit(1);