Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- int FFVideoStream::create_filter(const char *filter_spec)
- {
- double theta = get_rotation_angle();
- if( !theta && !filter_spec )
- return 0;
- avfilter_register_all();
- if( filter_spec ) {
- const char *sp = filter_spec;
- char filter_name[BCSTRLEN], *np = filter_name;
- int i = sizeof(filter_name);
- while( --i>=0 && *sp!=0 && !strchr(" \t:=,",*sp) ) *np++ = *sp++;
- *np = 0;
- const AVFilter *filter = !filter_name[0] ? 0 : avfilter_get_by_name(filter_name);
- //AVFilterContext *ctx = filter->ctx;
- int nb_pads = filter->nb_inputs;
- if( !filter || (nb_pads>1 && avfilter_pad_get_type(filter->inputs,0)) != AVMEDIA_TYPE_VIDEO ) {
- ff_err(AVERROR(EINVAL), "FFVideoStream::create_filter: %s\n", filter_spec);
- return -1;
- }
- }
- AVCodecParameters *avpar = st->codecpar;
- int sa_num = avpar->sample_aspect_ratio.num;
- if( !sa_num ) sa_num = 1;
- int sa_den = avpar->sample_aspect_ratio.den;
- if( !sa_den ) sa_num = 1;
- int ret = 0; char args[BCTEXTLEN];
- AVPixelFormat pix_fmt = (AVPixelFormat)avpar->format;
- snprintf(args, sizeof(args),
- "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
- avpar->width, avpar->height, (int)pix_fmt,
- st->time_base.num, st->time_base.den, sa_num, sa_den);
- if( ret >= 0 ) {
- filt_ctx = 0;
- ret = insert_filter("buffer", args, "in");
- buffersrc_ctx = filt_ctx;
- }
- if( ret >= 0 )
- ret = flip(theta);
- AVFilterContext *fsrc = filt_ctx;
- if(hw_device_ctx)
- fsrc->hw_device_ctx = hw_device_ctx;
- if( ret >= 0 ) {
- filt_ctx = 0;
- ret = insert_filter("buffersink", 0, "out");
- buffersink_ctx = filt_ctx;
- }
- if( ret >= 0 ) {
- ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
- (uint8_t*)&pix_fmt, sizeof(pix_fmt),
- AV_OPT_SEARCH_CHILDREN);
- }
- if( ret >= 0 )
- ret = config_filters(filter_spec, fsrc);
- else
- ff_err(ret, "FFVideoStream::create_filter");
- return ret >= 0 ? 0 : -1;
- }
Advertisement
Add Comment
Please, Sign In to add comment