16b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner/*
26b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
36b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
46b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    This library is free software; you can redistribute it and/or
56b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    modify it under the terms of the GNU Library General Public
66b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    License as published by the Free Software Foundation; either
76b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    version 2 of the License, or (at your option) any later version.
86b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
96b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    This library is distributed in the hope that it will be useful,
106b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    but WITHOUT ANY WARRANTY; without even the implied warranty of
116b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
126b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    Library General Public License for more details.
136b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
146b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    You should have received a copy of the GNU Library General Public License
156b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    along with this library; see the file COPYING.LIB.  If not, write to
166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    Boston, MA 02110-1301, USA.
186b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner*/
196b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
206b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "config.h"
216b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "ImageGStreamer.h"
226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
236b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#if USE(GSTREAMER)
246b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#include "GOwnPtr.h"
256b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
266b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerusing namespace std;
276b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brennerusing namespace WebCore;
286b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
296b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerPassRefPtr<ImageGStreamer> ImageGStreamer::createImage(GstBuffer* buffer)
306b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
316b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int width = 0, height = 0;
326b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    GstCaps* caps = gst_buffer_get_caps(buffer);
336b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    GstVideoFormat format;
346b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (!gst_video_format_parse_caps(caps, &format, &width, &height)) {
356b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        gst_caps_unref(caps);
366b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        return 0;
376b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    }
386b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
396b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    gst_caps_unref(caps);
406b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
416b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QImage::Format imageFormat;
426b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (format == GST_VIDEO_FORMAT_RGB)
436b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        imageFormat = QImage::Format_RGB888;
446b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    else
456b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        imageFormat = QImage::Format_RGB32;
466b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
476b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    return adoptRef(new ImageGStreamer(buffer, IntSize(width, height), imageFormat));
486b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
496b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
506b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerImageGStreamer::ImageGStreamer(GstBuffer*& buffer, IntSize size, QImage::Format imageFormat)
516b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    : m_image(0)
526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QPixmap* surface = new QPixmap;
546b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    QImage image(GST_BUFFER_DATA(buffer), size.width(), size.height(), imageFormat);
556b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    surface->convertFromImage(image);
566b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_image = BitmapImage::create(surface);
576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
596b70adc33054f8aee8c54d0f460458a9df11b8a5Russell BrennerImageGStreamer::~ImageGStreamer()
606b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner{
616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    if (m_image)
626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        m_image.clear();
636b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
646b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    m_image = 0;
656b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner}
666b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner#endif // USE(GSTREAMER)
676b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
68