Guest User

hwcontext for libavfilter?

a guest
May 10th, 2025
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.87 KB | Source Code | 0 0
  1. int FFVideoStream::create_filter(const char *filter_spec)
  2. {
  3.     double theta = get_rotation_angle();
  4.     if( !theta && !filter_spec )
  5.         return 0;
  6.     avfilter_register_all();
  7.     if( filter_spec ) {
  8.         const char *sp = filter_spec;
  9.         char filter_name[BCSTRLEN], *np = filter_name;
  10.         int i = sizeof(filter_name);
  11.         while( --i>=0 && *sp!=0 && !strchr(" \t:=,",*sp) ) *np++ = *sp++;
  12.         *np = 0;
  13.         const AVFilter *filter = !filter_name[0] ? 0 : avfilter_get_by_name(filter_name);
  14.         //AVFilterContext *ctx = filter->ctx;
  15.         int       nb_pads = filter->nb_inputs;
  16.         if( !filter || (nb_pads>1 && avfilter_pad_get_type(filter->inputs,0)) != AVMEDIA_TYPE_VIDEO ) {
  17.             ff_err(AVERROR(EINVAL), "FFVideoStream::create_filter: %s\n", filter_spec);
  18.             return -1;
  19.         }
  20.     }
  21.     AVCodecParameters *avpar = st->codecpar;
  22.     int sa_num = avpar->sample_aspect_ratio.num;
  23.     if( !sa_num ) sa_num = 1;
  24.     int sa_den = avpar->sample_aspect_ratio.den;
  25.     if( !sa_den ) sa_num = 1;
  26.  
  27.     int ret = 0;  char args[BCTEXTLEN];
  28.     AVPixelFormat pix_fmt = (AVPixelFormat)avpar->format;
  29.     snprintf(args, sizeof(args),
  30.         "video_size=%dx%d:pix_fmt=%d:time_base=%d/%d:pixel_aspect=%d/%d",
  31.         avpar->width, avpar->height, (int)pix_fmt,
  32.         st->time_base.num, st->time_base.den, sa_num, sa_den);
  33.     if( ret >= 0 ) {
  34.         filt_ctx = 0;
  35.         ret = insert_filter("buffer", args, "in");
  36.         buffersrc_ctx = filt_ctx;
  37.     }
  38.     if( ret >= 0 )
  39.         ret = flip(theta);
  40.     AVFilterContext *fsrc = filt_ctx;
  41.     if(hw_device_ctx)
  42.     fsrc->hw_device_ctx = hw_device_ctx;
  43.     if( ret >= 0 ) {
  44.         filt_ctx = 0;
  45.         ret = insert_filter("buffersink", 0, "out");
  46.         buffersink_ctx = filt_ctx;
  47.     }
  48.     if( ret >= 0 ) {
  49.         ret = av_opt_set_bin(buffersink_ctx, "pix_fmts",
  50.             (uint8_t*)&pix_fmt, sizeof(pix_fmt),
  51.             AV_OPT_SEARCH_CHILDREN);
  52.     }
  53.     if( ret >= 0 )
  54.         ret = config_filters(filter_spec, fsrc);
  55.     else
  56.         ff_err(ret, "FFVideoStream::create_filter");
  57.     return ret >= 0 ? 0 : -1;
  58. }
  59.  
Advertisement
Add Comment
Please, Sign In to add comment