mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
Remove messy pading hack in ffmpeg.c.
Use avfilters if you want padding! Originally committed as revision 23050 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
bdab692f48
commit
0c22311b56
141
ffmpeg.c
141
ffmpeg.c
@ -126,11 +126,6 @@ static int frame_height = 0;
|
||||
static float frame_aspect_ratio = 0;
|
||||
static enum PixelFormat frame_pix_fmt = PIX_FMT_NONE;
|
||||
static enum SampleFormat audio_sample_fmt = SAMPLE_FMT_NONE;
|
||||
static int frame_padtop = 0;
|
||||
static int frame_padbottom = 0;
|
||||
static int frame_padleft = 0;
|
||||
static int frame_padright = 0;
|
||||
static int padcolor[3] = {16,128,128}; /* default to black */
|
||||
static int frame_topBand = 0;
|
||||
static int frame_bottomBand = 0;
|
||||
static int frame_leftBand = 0;
|
||||
@ -285,13 +280,6 @@ typedef struct AVOutputStream {
|
||||
int original_leftBand;
|
||||
int original_rightBand;
|
||||
|
||||
/* padding area sizes */
|
||||
int video_pad;
|
||||
int padtop;
|
||||
int padbottom;
|
||||
int padleft;
|
||||
int padright;
|
||||
|
||||
/* audio only */
|
||||
int audio_resample;
|
||||
ReSampleContext *resample; /* for audio resampling */
|
||||
@ -440,8 +428,8 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
|
||||
char crop_args[255];
|
||||
AVFilterContext *filt_crop;
|
||||
snprintf(crop_args, 255, "%d:%d:%d:%d", ost->leftBand, ost->topBand,
|
||||
codec->width - (frame_padleft + frame_padright),
|
||||
codec->height - (frame_padtop + frame_padbottom));
|
||||
codec->width,
|
||||
codec->height);
|
||||
filt_crop = avfilter_open(avfilter_get_by_name("crop"), NULL);
|
||||
if (!filt_crop)
|
||||
return -1;
|
||||
@ -454,15 +442,13 @@ static int configure_filters(AVInputStream *ist, AVOutputStream *ost)
|
||||
}
|
||||
|
||||
if((codec->width !=
|
||||
icodec->width - (frame_leftBand + frame_rightBand) +
|
||||
(frame_padleft + frame_padright)) ||
|
||||
(codec->height != icodec->height - (frame_topBand + frame_bottomBand) +
|
||||
(frame_padtop + frame_padbottom))) {
|
||||
icodec->width - (frame_leftBand + frame_rightBand)) ||
|
||||
(codec->height != icodec->height - (frame_topBand + frame_bottomBand))) {
|
||||
char scale_args[255];
|
||||
AVFilterContext *filt_scale;
|
||||
snprintf(scale_args, 255, "%d:%d:flags=0x%X",
|
||||
codec->width - (frame_padleft + frame_padright),
|
||||
codec->height - (frame_padtop + frame_padbottom),
|
||||
codec->width,
|
||||
codec->height,
|
||||
(int)av_get_int(sws_opts, "sws_flags", NULL));
|
||||
filt_scale = avfilter_open(avfilter_get_by_name("scale"), NULL);
|
||||
if (!filt_scale)
|
||||
@ -1223,18 +1209,6 @@ static void do_video_out(AVFormatContext *s,
|
||||
final_picture = formatted_picture;
|
||||
padding_src = formatted_picture;
|
||||
resampling_dst = &ost->pict_tmp;
|
||||
if (ost->video_pad) {
|
||||
final_picture = &ost->pict_tmp;
|
||||
if (ost->video_resample) {
|
||||
if (av_picture_crop((AVPicture *)&picture_pad_temp, (AVPicture *)final_picture, enc->pix_fmt, ost->padtop, ost->padleft) < 0) {
|
||||
fprintf(stderr, "error padding picture\n");
|
||||
if (exit_on_error)
|
||||
av_exit(1);
|
||||
return;
|
||||
}
|
||||
resampling_dst = &picture_pad_temp;
|
||||
}
|
||||
}
|
||||
|
||||
if( (ost->resample_height != (ist->st->codec->height - (ost->topBand + ost->bottomBand)))
|
||||
|| (ost->resample_width != (ist->st->codec->width - (ost->leftBand + ost->rightBand)))
|
||||
@ -1281,8 +1255,8 @@ static void do_video_out(AVFormatContext *s,
|
||||
ist->st->codec->width - (ost->leftBand + ost->rightBand),
|
||||
ist->st->codec->height - (ost->topBand + ost->bottomBand),
|
||||
ist->st->codec->pix_fmt,
|
||||
ost->st->codec->width - (ost->padleft + ost->padright),
|
||||
ost->st->codec->height - (ost->padtop + ost->padbottom),
|
||||
ost->st->codec->width,
|
||||
ost->st->codec->height,
|
||||
ost->st->codec->pix_fmt,
|
||||
sws_flags, NULL, NULL, NULL);
|
||||
if (ost->img_resample_ctx == NULL) {
|
||||
@ -1295,12 +1269,6 @@ static void do_video_out(AVFormatContext *s,
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ost->video_pad) {
|
||||
av_picture_pad((AVPicture*)final_picture, (AVPicture *)padding_src,
|
||||
enc->height, enc->width, enc->pix_fmt,
|
||||
ost->padtop, ost->padbottom, ost->padleft, ost->padright, padcolor);
|
||||
}
|
||||
|
||||
/* duplicates frame if needed */
|
||||
for(i=0;i<nb_frames;i++) {
|
||||
AVPacket pkt;
|
||||
@ -2261,13 +2229,10 @@ static int av_transcode(AVFormatContext **output_files,
|
||||
av_exit(1);
|
||||
}
|
||||
ost->video_crop = ((frame_leftBand + frame_rightBand + frame_topBand + frame_bottomBand) != 0);
|
||||
ost->video_pad = ((frame_padleft + frame_padright + frame_padtop + frame_padbottom) != 0);
|
||||
ost->video_resample = ((codec->width != icodec->width -
|
||||
(frame_leftBand + frame_rightBand) +
|
||||
(frame_padleft + frame_padright)) ||
|
||||
(frame_leftBand + frame_rightBand)) ||
|
||||
(codec->height != icodec->height -
|
||||
(frame_topBand + frame_bottomBand) +
|
||||
(frame_padtop + frame_padbottom)) ||
|
||||
(frame_topBand + frame_bottomBand)) ||
|
||||
(codec->pix_fmt != icodec->pix_fmt));
|
||||
if (ost->video_crop) {
|
||||
ost->topBand = ost->original_topBand = frame_topBand;
|
||||
@ -2275,18 +2240,6 @@ static int av_transcode(AVFormatContext **output_files,
|
||||
ost->leftBand = ost->original_leftBand = frame_leftBand;
|
||||
ost->rightBand = ost->original_rightBand = frame_rightBand;
|
||||
}
|
||||
if (ost->video_pad) {
|
||||
ost->padtop = frame_padtop;
|
||||
ost->padleft = frame_padleft;
|
||||
ost->padbottom = frame_padbottom;
|
||||
ost->padright = frame_padright;
|
||||
if (!ost->video_resample) {
|
||||
avcodec_get_frame_defaults(&ost->pict_tmp);
|
||||
if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
|
||||
codec->width, codec->height))
|
||||
goto fail;
|
||||
}
|
||||
}
|
||||
if (ost->video_resample) {
|
||||
avcodec_get_frame_defaults(&ost->pict_tmp);
|
||||
if(avpicture_alloc((AVPicture*)&ost->pict_tmp, codec->pix_fmt,
|
||||
@ -2299,8 +2252,8 @@ static int av_transcode(AVFormatContext **output_files,
|
||||
icodec->width - (frame_leftBand + frame_rightBand),
|
||||
icodec->height - (frame_topBand + frame_bottomBand),
|
||||
icodec->pix_fmt,
|
||||
codec->width - (frame_padleft + frame_padright),
|
||||
codec->height - (frame_padtop + frame_padbottom),
|
||||
codec->width,
|
||||
codec->height,
|
||||
codec->pix_fmt,
|
||||
sws_flags, NULL, NULL, NULL);
|
||||
if (ost->img_resample_ctx == NULL) {
|
||||
@ -2872,58 +2825,10 @@ static void opt_frame_size(const char *arg)
|
||||
}
|
||||
}
|
||||
|
||||
static void opt_pad_color(const char *arg) {
|
||||
/* Input is expected to be six hex digits similar to
|
||||
how colors are expressed in html tags (but without the #) */
|
||||
int rgb = strtol(arg, NULL, 16);
|
||||
int r,g,b;
|
||||
|
||||
r = (rgb >> 16);
|
||||
g = ((rgb >> 8) & 255);
|
||||
b = (rgb & 255);
|
||||
|
||||
padcolor[0] = RGB_TO_Y(r,g,b);
|
||||
padcolor[1] = RGB_TO_U(r,g,b,0);
|
||||
padcolor[2] = RGB_TO_V(r,g,b,0);
|
||||
}
|
||||
|
||||
static void opt_frame_pad_top(const char *arg)
|
||||
{
|
||||
frame_padtop = atoi(arg);
|
||||
if (frame_padtop < 0) {
|
||||
fprintf(stderr, "Incorrect top pad size\n");
|
||||
static void opt_pad(const char *arg) {
|
||||
fprintf(stderr, "Please use vfilters=pad\n");
|
||||
av_exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void opt_frame_pad_bottom(const char *arg)
|
||||
{
|
||||
frame_padbottom = atoi(arg);
|
||||
if (frame_padbottom < 0) {
|
||||
fprintf(stderr, "Incorrect bottom pad size\n");
|
||||
av_exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void opt_frame_pad_left(const char *arg)
|
||||
{
|
||||
frame_padleft = atoi(arg);
|
||||
if (frame_padleft < 0) {
|
||||
fprintf(stderr, "Incorrect left pad size\n");
|
||||
av_exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void opt_frame_pad_right(const char *arg)
|
||||
{
|
||||
frame_padright = atoi(arg);
|
||||
if (frame_padright < 0) {
|
||||
fprintf(stderr, "Incorrect right pad size\n");
|
||||
av_exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
static void opt_frame_pix_fmt(const char *arg)
|
||||
{
|
||||
@ -3226,8 +3131,8 @@ static void opt_input_file(const char *filename)
|
||||
ap->channels = audio_channels;
|
||||
ap->time_base.den = frame_rate.num;
|
||||
ap->time_base.num = frame_rate.den;
|
||||
ap->width = frame_width + frame_padleft + frame_padright;
|
||||
ap->height = frame_height + frame_padtop + frame_padbottom;
|
||||
ap->width = frame_width;
|
||||
ap->height = frame_height;
|
||||
ap->pix_fmt = frame_pix_fmt;
|
||||
// ap->sample_fmt = audio_sample_fmt; //FIXME:not implemented in libavformat
|
||||
ap->channel = video_channel;
|
||||
@ -3483,8 +3388,8 @@ static void new_video_stream(AVFormatContext *oc)
|
||||
video_enc->time_base.den = fps.num;
|
||||
video_enc->time_base.num = fps.den;
|
||||
|
||||
video_enc->width = frame_width + frame_padright + frame_padleft;
|
||||
video_enc->height = frame_height + frame_padtop + frame_padbottom;
|
||||
video_enc->width = frame_width;
|
||||
video_enc->height = frame_height;
|
||||
video_enc->sample_aspect_ratio = av_d2q(frame_aspect_ratio*video_enc->height/video_enc->width, 255);
|
||||
video_enc->pix_fmt = frame_pix_fmt;
|
||||
st->sample_aspect_ratio = video_enc->sample_aspect_ratio;
|
||||
@ -4277,11 +4182,11 @@ static const OptionDef options[] = {
|
||||
{ "cropbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_bottom}, "set bottom crop band size (in pixels)", "size" },
|
||||
{ "cropleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_left}, "set left crop band size (in pixels)", "size" },
|
||||
{ "cropright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_crop_right}, "set right crop band size (in pixels)", "size" },
|
||||
{ "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_top}, "set top pad band size (in pixels)", "size" },
|
||||
{ "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_bottom}, "set bottom pad band size (in pixels)", "size" },
|
||||
{ "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_left}, "set left pad band size (in pixels)", "size" },
|
||||
{ "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_frame_pad_right}, "set right pad band size (in pixels)", "size" },
|
||||
{ "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad_color}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
|
||||
{ "padtop", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "set top pad band size (in pixels)", "size" },
|
||||
{ "padbottom", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "set bottom pad band size (in pixels)", "size" },
|
||||
{ "padleft", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "set left pad band size (in pixels)", "size" },
|
||||
{ "padright", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "set right pad band size (in pixels)", "size" },
|
||||
{ "padcolor", HAS_ARG | OPT_VIDEO, {(void*)opt_pad}, "set color of pad bands (Hex 000000 thru FFFFFF)", "color" },
|
||||
{ "intra", OPT_BOOL | OPT_EXPERT | OPT_VIDEO, {(void*)&intra_only}, "use only intra frames"},
|
||||
{ "vn", OPT_BOOL | OPT_VIDEO, {(void*)&video_disable}, "disable video" },
|
||||
{ "vdt", OPT_INT | HAS_ARG | OPT_EXPERT | OPT_VIDEO, {(void*)&video_discard}, "discard threshold", "n" },
|
||||
|
Loading…
Reference in New Issue
Block a user