예제 #1
0
static SchroFrame *
gst_schro_wrap_frame (GstSchroDec *schro_dec, GstBuffer *buffer)
{
  SchroFrame *frame;

  switch (schro_dec->fourcc) {
    case GST_MAKE_FOURCC('I','4','2','0'):
      frame = schro_frame_new_from_data_I420 (GST_BUFFER_DATA (buffer),
          schro_dec->width, schro_dec->height);
      break;
    case GST_MAKE_FOURCC('Y','U','Y','2'):
      frame = schro_frame_new_from_data_YUY2 (GST_BUFFER_DATA (buffer),
          schro_dec->width, schro_dec->height);
      break;
    case GST_MAKE_FOURCC('A','Y','U','V'):
      frame = schro_frame_new_from_data_AYUV (GST_BUFFER_DATA (buffer),
          schro_dec->width, schro_dec->height);
      break;
    default:
      g_assert_not_reached();
      break;
  }
  schro_frame_set_free_callback (frame, gst_schro_frame_free, buffer);

  return frame;
}
예제 #2
0
static GstFlowReturn
gst_schrodownsample_transform (GstBaseTransform * base_transform,
    GstBuffer *inbuf, GstBuffer *outbuf)
{
  GstSchrodownsample *compress;
  SchroFrame *outframe;
  int width, height;
  uint32_t format;
  SchroFrame *stack[10];
  int n = 0;
  
  g_return_val_if_fail (GST_IS_SCHRODOWNSAMPLE (base_transform), GST_FLOW_ERROR);
  compress = GST_SCHRODOWNSAMPLE (base_transform);

  gst_structure_get_fourcc (gst_caps_get_structure(inbuf->caps, 0),
      "format", &format);
  gst_structure_get_int (gst_caps_get_structure(inbuf->caps, 0),
      "width", &width);
  gst_structure_get_int (gst_caps_get_structure(inbuf->caps, 0),
      "height", &height);

  switch (format) {
    case GST_MAKE_FOURCC('I','4','2','0'):
      stack[n] = schro_frame_new_from_data_I420 (GST_BUFFER_DATA(inbuf),
          width, height);
      n++;
      outframe = schro_frame_new_from_data_I420 (GST_BUFFER_DATA(outbuf),
          width/2, height/2);
      break;
    case GST_MAKE_FOURCC('Y','V','1','2'):
      stack[n] = schro_frame_new_from_data_YV12 (GST_BUFFER_DATA(inbuf),
          width, height);
      n++;
      outframe = schro_frame_new_from_data_YV12 (GST_BUFFER_DATA(outbuf),
          width/2, height/2);
      break;
    case GST_MAKE_FOURCC('Y','U','Y','2'):
      stack[n] = schro_frame_new_from_data_YUY2 (GST_BUFFER_DATA(inbuf),
          width, height);
      n++;
      stack[n] = schro_virt_frame_new_unpack (stack[n-1]);
      n++;
      outframe = schro_frame_new_from_data_YUY2 (GST_BUFFER_DATA(outbuf),
          width/2, height/2);
      break;
    case GST_MAKE_FOURCC('U','Y','V','Y'):
      stack[n] = schro_frame_new_from_data_UYVY (GST_BUFFER_DATA(inbuf),
          width, height);
      n++;
      stack[n] = schro_virt_frame_new_unpack (stack[n-1]);
      n++;
      outframe = schro_frame_new_from_data_UYVY (GST_BUFFER_DATA(outbuf),
          width/2, height/2);
      break;
    case GST_MAKE_FOURCC('A','Y','U','V'):
      stack[n] = schro_frame_new_from_data_AYUV (GST_BUFFER_DATA(inbuf),
          width, height);
      n++;
      stack[n] = schro_virt_frame_new_unpack (stack[n-1]);
      n++;
      outframe = schro_frame_new_from_data_AYUV (GST_BUFFER_DATA(outbuf),
          width/2, height/2);
      break;
    default:
      g_assert_not_reached();
  }

  stack[n] = schro_virt_frame_new_horiz_downsample (stack[n-1]);
  n++;
  stack[n] = schro_virt_frame_new_vert_downsample (stack[n-1]);
  n++;

  switch (format) {
    case GST_MAKE_FOURCC('Y','U','Y','2'):
      stack[n] = schro_virt_frame_new_pack_YUY2 (stack[n-1]);
      n++;
      break;
    case GST_MAKE_FOURCC('U','Y','V','Y'):
      stack[n] = schro_virt_frame_new_pack_UYVY (stack[n-1]);
      n++;
      break;
    case GST_MAKE_FOURCC('A','Y','U','V'):
      stack[n] = schro_virt_frame_new_pack_AYUV (stack[n-1]);
      n++;
      break;
    default:
      break;
  }

  schro_virt_frame_render (stack[n-1], outframe);

  while(n>0) {
    schro_frame_unref (stack[n-1]);
    n--;
  }

  return GST_FLOW_OK;
}
예제 #3
0
SchroFrame *
gst_schro_buffer_wrap (GstBuffer * buf, GstVideoFormat format, int width,
    int height)
{
  SchroFrame *frame;

  switch (format) {
    case GST_VIDEO_FORMAT_I420:
      frame =
          schro_frame_new_from_data_I420 (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_YV12:
      frame =
          schro_frame_new_from_data_YV12 (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_YUY2:
      frame =
          schro_frame_new_from_data_YUY2 (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_UYVY:
      frame =
          schro_frame_new_from_data_UYVY (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_AYUV:
      frame =
          schro_frame_new_from_data_AYUV (GST_BUFFER_DATA (buf), width, height);
      break;
#if SCHRO_CHECK_VERSION(1,0,12)
    case GST_VIDEO_FORMAT_ARGB:
      frame =
          schro_frame_new_from_data_ARGB (GST_BUFFER_DATA (buf), width, height);
      break;
#endif
#if SCHRO_CHECK_VERSION(1,0,11)
    case GST_VIDEO_FORMAT_Y42B:
      frame =
          schro_frame_new_from_data_Y42B (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_Y444:
      frame =
          schro_frame_new_from_data_Y444 (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_v210:
      frame =
          schro_frame_new_from_data_v210 (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_v216:
      frame =
          schro_frame_new_from_data_v216 (GST_BUFFER_DATA (buf), width, height);
      break;
    case GST_VIDEO_FORMAT_AYUV64:
      frame =
          schro_frame_new_from_data_AY64 (GST_BUFFER_DATA (buf), width, height);
      break;
#endif
    default:
      g_assert_not_reached ();
      return NULL;
  }
  schro_frame_set_free_callback (frame, gst_schro_frame_free, buf);

  return frame;
}