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; }
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; }
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; }