1/* 2 * Copyright (C) 2010 Igalia S.L 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 */ 19 20#include "config.h" 21 22#include "GraphicsContextCG.h" 23#include "ImageGStreamer.h" 24#if USE(GSTREAMER) 25 26using namespace WebCore; 27 28PassRefPtr<ImageGStreamer> ImageGStreamer::createImage(GstBuffer* buffer) 29{ 30 int width = 0, height = 0; 31 GstCaps* caps = gst_buffer_get_caps(buffer); 32 GstVideoFormat format; 33 if (!gst_video_format_parse_caps(caps, &format, &width, &height)) { 34 gst_caps_unref(caps); 35 return NULL; 36 } 37 38 return adoptRef(new ImageGStreamer(buffer, IntSize(width, height))); 39} 40 41ImageGStreamer::ImageGStreamer(GstBuffer*& buffer, IntSize size) 42 : m_image(0) 43{ 44 ASSERT(GST_BUFFER_SIZE(buffer)); 45 46 RetainPtr<CFDataRef> data(AdoptCF, CFDataCreateWithBytesNoCopy(0, static_cast<UInt8*>(GST_BUFFER_DATA(buffer)), GST_BUFFER_SIZE(buffer), kCFAllocatorNull)); 47 RetainPtr<CGDataProviderRef> provider(AdoptCF, CGDataProviderCreateWithCFData(data.get())); 48 CGImageRef frameImage = CGImageCreate(size.width(), size.height(), 8, 32, size.width()*4, deviceRGBColorSpaceRef(), 49 kCGBitmapByteOrder32Little | kCGImageAlphaFirst, provider.get(), 0, false, kCGRenderingIntentDefault); 50 m_image = BitmapImage::create(frameImage); 51} 52 53ImageGStreamer::~ImageGStreamer() 54{ 55 if (m_image) 56 m_image.clear(); 57 58 m_image = 0; 59} 60 61#endif // USE(GSTREAMER) 62