It has not worked for anything other than fringe codecs (asv1/2, mdec, mjpeg[b]) since about 2003 and nobody ever noticed or complained. This sufficiently proves that there are no users of this option who have a clue of what they are doing, so it is completely useless.tags/n1.1
| @@ -50,6 +50,7 @@ version <next>: | |||||
| - Smooth Streaming live segmenter muxer | - Smooth Streaming live segmenter muxer | ||||
| - RTP packetization of JPEG | - RTP packetization of JPEG | ||||
| - Opus decoder and encoder using libopus | - Opus decoder and encoder using libopus | ||||
| - remove -same_quant, it hasn't worked for years | |||||
| version 0.8: | version 0.8: | ||||
| @@ -514,7 +514,7 @@ static void do_subtitle_out(AVFormatContext *s, | |||||
| static void do_video_out(AVFormatContext *s, | static void do_video_out(AVFormatContext *s, | ||||
| OutputStream *ost, | OutputStream *ost, | ||||
| AVFrame *in_picture, | AVFrame *in_picture, | ||||
| int *frame_size, float quality) | |||||
| int *frame_size) | |||||
| { | { | ||||
| int ret, format_video_sync; | int ret, format_video_sync; | ||||
| AVPacket pkt; | AVPacket pkt; | ||||
| @@ -579,9 +579,7 @@ static void do_video_out(AVFormatContext *s, | |||||
| big_picture.top_field_first = !!ost->top_field_first; | big_picture.top_field_first = !!ost->top_field_first; | ||||
| } | } | ||||
| /* handles same_quant here. This is not correct because it may | |||||
| not be a global option */ | |||||
| big_picture.quality = quality; | |||||
| big_picture.quality = ost->st->codec->global_quality; | |||||
| if (!enc->me_threshold) | if (!enc->me_threshold) | ||||
| big_picture.pict_type = 0; | big_picture.pict_type = 0; | ||||
| if (ost->forced_kf_index < ost->forced_kf_count && | if (ost->forced_kf_index < ost->forced_kf_count && | ||||
| @@ -708,9 +706,7 @@ static int poll_filter(OutputStream *ost) | |||||
| if (!ost->frame_aspect_ratio) | if (!ost->frame_aspect_ratio) | ||||
| ost->st->codec->sample_aspect_ratio = picref->video->pixel_aspect; | ost->st->codec->sample_aspect_ratio = picref->video->pixel_aspect; | ||||
| do_video_out(of->ctx, ost, filtered_frame, &frame_size, | |||||
| same_quant ? ost->last_quality : | |||||
| ost->st->codec->global_quality); | |||||
| do_video_out(of->ctx, ost, filtered_frame, &frame_size); | |||||
| if (vstats_filename && frame_size) | if (vstats_filename && frame_size) | ||||
| do_video_stats(of->ctx, ost, frame_size); | do_video_stats(of->ctx, ost, frame_size); | ||||
| break; | break; | ||||
| @@ -1223,7 +1219,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output) | |||||
| AVFrame *decoded_frame; | AVFrame *decoded_frame; | ||||
| void *buffer_to_free = NULL; | void *buffer_to_free = NULL; | ||||
| int i, ret = 0, resample_changed; | int i, ret = 0, resample_changed; | ||||
| float quality; | |||||
| if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame())) | if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame())) | ||||
| return AVERROR(ENOMEM); | return AVERROR(ENOMEM); | ||||
| @@ -1241,7 +1236,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output) | |||||
| return ret; | return ret; | ||||
| } | } | ||||
| quality = same_quant ? decoded_frame->quality : 0; | |||||
| decoded_frame->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts, | decoded_frame->pts = guess_correct_pts(&ist->pts_ctx, decoded_frame->pkt_pts, | ||||
| decoded_frame->pkt_dts); | decoded_frame->pkt_dts); | ||||
| pkt->size = 0; | pkt->size = 0; | ||||
| @@ -1279,10 +1273,6 @@ static int decode_video(InputStream *ist, AVPacket *pkt, int *got_output) | |||||
| } | } | ||||
| for (i = 0; i < ist->nb_filters; i++) { | for (i = 0; i < ist->nb_filters; i++) { | ||||
| // XXX what an ugly hack | |||||
| if (ist->filters[i]->graph->nb_outputs == 1) | |||||
| ist->filters[i]->graph->outputs[0]->ost->last_quality = quality; | |||||
| if (ist->st->codec->codec->capabilities & CODEC_CAP_DR1) { | if (ist->st->codec->codec->capabilities & CODEC_CAP_DR1) { | ||||
| FrameBuffer *buf = decoded_frame->opaque; | FrameBuffer *buf = decoded_frame->opaque; | ||||
| AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays( | AVFilterBufferRef *fb = avfilter_get_video_buffer_ref_from_arrays( | ||||
| @@ -278,7 +278,6 @@ typedef struct OutputStream { | |||||
| int top_field_first; | int top_field_first; | ||||
| float frame_aspect_ratio; | float frame_aspect_ratio; | ||||
| float last_quality; | |||||
| /* forced key frames */ | /* forced key frames */ | ||||
| int64_t *forced_kf_pts; | int64_t *forced_kf_pts; | ||||
| @@ -343,7 +342,6 @@ extern int copy_tb; | |||||
| extern int exit_on_error; | extern int exit_on_error; | ||||
| extern int print_stats; | extern int print_stats; | ||||
| extern int qp_hist; | extern int qp_hist; | ||||
| extern int same_quant; | |||||
| extern const AVIOInterruptCB int_cb; | extern const AVIOInterruptCB int_cb; | ||||
| @@ -71,7 +71,6 @@ int copy_tb = 1; | |||||
| int exit_on_error = 0; | int exit_on_error = 0; | ||||
| int print_stats = 1; | int print_stats = 1; | ||||
| int qp_hist = 0; | int qp_hist = 0; | ||||
| int same_quant = 0; | |||||
| static int file_overwrite = 0; | static int file_overwrite = 0; | ||||
| static int video_discard = 0; | static int video_discard = 0; | ||||
| @@ -836,7 +835,7 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e | |||||
| } | } | ||||
| MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st); | MATCH_PER_STREAM_OPT(qscale, dbl, qscale, oc, st); | ||||
| if (qscale >= 0 || same_quant) { | |||||
| if (qscale >= 0) { | |||||
| st->codec->flags |= CODEC_FLAG_QSCALE; | st->codec->flags |= CODEC_FLAG_QSCALE; | ||||
| st->codec->global_quality = FF_QP2LAMBDA * qscale; | st->codec->global_quality = FF_QP2LAMBDA * qscale; | ||||
| } | } | ||||
| @@ -1969,8 +1968,6 @@ const OptionDef options[] = { | |||||
| "rate control override for specific intervals", "override" }, | "rate control override for specific intervals", "override" }, | ||||
| { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_codec }, | { "vcodec", OPT_VIDEO | HAS_ARG | OPT_PERFILE, { .func_arg = opt_video_codec }, | ||||
| "force video codec ('copy' to copy stream)", "codec" }, | "force video codec ('copy' to copy stream)", "codec" }, | ||||
| { "same_quant", OPT_VIDEO | OPT_BOOL | OPT_EXPERT, { &same_quant }, | |||||
| "use same quantizer as source (implies VBR)" }, | |||||
| { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT, { .off = OFFSET(pass) }, | { "pass", OPT_VIDEO | HAS_ARG | OPT_SPEC | OPT_INT, { .off = OFFSET(pass) }, | ||||
| "select the pass number (1 or 2)", "n" }, | "select the pass number (1 or 2)", "n" }, | ||||
| { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(passlogfiles) }, | { "passlogfile", OPT_VIDEO | HAS_ARG | OPT_STRING | OPT_EXPERT | OPT_SPEC, { .off = OFFSET(passlogfiles) }, | ||||
| @@ -473,11 +473,6 @@ Disable video recording. | |||||
| @item -vcodec @var{codec} (@emph{output}) | @item -vcodec @var{codec} (@emph{output}) | ||||
| Set the video codec. This is an alias for @code{-codec:v}. | Set the video codec. This is an alias for @code{-codec:v}. | ||||
| @item -same_quant | |||||
| Use same quantizer as source (implies VBR). | |||||
| Note that this is NOT SAME QUALITY. Do not use this option unless you know you | |||||
| need it. | |||||
| @item -pass[:@var{stream_specifier}] @var{n} (@emph{output,per-stream}) | @item -pass[:@var{stream_specifier}] @var{n} (@emph{output,per-stream}) | ||||
| Select the pass number (1 or 2). It is used to do two-pass | Select the pass number (1 or 2). It is used to do two-pass | ||||
| @@ -216,15 +216,14 @@ equally humble @code{copy} under Windows), and finally transcoding back to your | |||||
| format of choice. | format of choice. | ||||
| @example | @example | ||||
| avconv -i input1.avi -same_quant intermediate1.mpg | |||||
| avconv -i input2.avi -same_quant intermediate2.mpg | |||||
| avconv -i input1.avi intermediate1.mpg | |||||
| avconv -i input2.avi intermediate2.mpg | |||||
| cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg | cat intermediate1.mpg intermediate2.mpg > intermediate_all.mpg | ||||
| avconv -i intermediate_all.mpg -same_quant output.avi | |||||
| avconv -i intermediate_all.mpg output.avi | |||||
| @end example | @end example | ||||
| Notice that you should either use @code{-same_quant} or set a reasonably high | |||||
| bitrate for your intermediate and output files, if you want to preserve | |||||
| video quality. | |||||
| Notice that you should set a reasonably high bitrate for your intermediate and | |||||
| output files, if you want to preserve video quality. | |||||
| Also notice that you may avoid the huge intermediate files by taking advantage | Also notice that you may avoid the huge intermediate files by taking advantage | ||||
| of named pipes, should your platform support it: | of named pipes, should your platform support it: | ||||
| @@ -232,10 +231,10 @@ of named pipes, should your platform support it: | |||||
| @example | @example | ||||
| mkfifo intermediate1.mpg | mkfifo intermediate1.mpg | ||||
| mkfifo intermediate2.mpg | mkfifo intermediate2.mpg | ||||
| avconv -i input1.avi -same_quant -y intermediate1.mpg < /dev/null & | |||||
| avconv -i input2.avi -same_quant -y intermediate2.mpg < /dev/null & | |||||
| avconv -i input1.avi -y intermediate1.mpg < /dev/null & | |||||
| avconv -i input2.avi -y intermediate2.mpg < /dev/null & | |||||
| cat intermediate1.mpg intermediate2.mpg |\ | cat intermediate1.mpg intermediate2.mpg |\ | ||||
| avconv -f mpeg -i - -same_quant -c:v mpeg4 -acodec libmp3lame output.avi | |||||
| avconv -f mpeg -i - -c:v mpeg4 -acodec libmp3lame output.avi | |||||
| @end example | @end example | ||||
| Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also | Similarly, the yuv4mpegpipe format, and the raw video, raw audio codecs also | ||||
| @@ -262,7 +261,7 @@ cat temp1.a temp2.a > all.a & | |||||
| cat temp1.v temp2.v > all.v & | cat temp1.v temp2.v > all.v & | ||||
| avconv -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \ | avconv -f u16le -acodec pcm_s16le -ac 2 -ar 44100 -i all.a \ | ||||
| -f yuv4mpegpipe -i all.v \ | -f yuv4mpegpipe -i all.v \ | ||||
| -same_quant -y output.flv | |||||
| -y output.flv | |||||
| rm temp[12].[av] all.[av] | rm temp[12].[av] all.[av] | ||||
| @end example | @end example | ||||