void VideoDecoderGst::push(const EncodedVideoFrame& frame) { GstBuffer* buffer; EncodedExtraGstData* extradata = dynamic_cast<EncodedExtraGstData*>(frame.extradata.get()); if (extradata) { buffer = extradata->buffer; } else { buffer = gst_buffer_new(); GST_BUFFER_DATA(buffer) = const_cast<boost::uint8_t*>(frame.data()); GST_BUFFER_SIZE(buffer) = frame.dataSize(); GST_BUFFER_OFFSET(buffer) = frame.frameNum(); GST_BUFFER_TIMESTAMP(buffer) = GST_CLOCK_TIME_NONE; GST_BUFFER_DURATION(buffer) = GST_CLOCK_TIME_NONE; } bool success = swfdec_gst_decoder_push(&_decoder, buffer); if (!success) { log_error(_("VideoDecoderGst: buffer push failed.")); } }
boost::uint8_t* AudioDecoderGst::decode(const EncodedAudioFrame& ef, boost::uint32_t& outputSize) { outputSize = 0; GstBuffer* gstbuf; EncodedExtraGstData* extradata = dynamic_cast<EncodedExtraGstData*>(ef.extradata.get()); if (extradata) { gstbuf = extradata->buffer; } else { gstbuf = gst_buffer_new_and_alloc(ef.dataSize); memcpy (GST_BUFFER_DATA (gstbuf), ef.data.get(), ef.dataSize); } bool success = swfdec_gst_decoder_push(&_decoder, gstbuf); if (!success) { log_error(_("AudioDecoderGst: buffer push failed.")); return 0; } return pullBuffers(outputSize); }
static void swfdec_video_decoder_gst_decode (SwfdecVideoDecoder *dec, SwfdecBuffer *buffer) { SwfdecVideoDecoderGst *player = SWFDEC_VIDEO_DECODER_GST (dec); #define SWFDEC_ALIGN(x, n) (((x) + (n) - 1) & (~((n) - 1))) GstBuffer *buf; GstCaps *caps; GstStructure *structure; buf = swfdec_gst_buffer_new (swfdec_buffer_ref (buffer)); if (!swfdec_gst_decoder_push (&player->dec, buf)) { swfdec_video_decoder_error (dec, "failed to push buffer"); return; } buf = swfdec_gst_decoder_pull (&player->dec); if (buf == NULL) { SWFDEC_ERROR ("failed to pull decoded buffer. Broken stream?"); return; } else { if (player->last) gst_buffer_unref (player->last); player->last = buf; } while ((buf = swfdec_gst_decoder_pull (&player->dec))) { SWFDEC_ERROR ("too many output buffers!"); gst_buffer_unref (buf); } caps = gst_buffer_get_caps (player->last); if (caps == NULL) { swfdec_video_decoder_error (dec, "no caps on decoded buffer"); return; } structure = gst_caps_get_structure (caps, 0); if (!gst_structure_get_int (structure, "width", (int *) &dec->width) || !gst_structure_get_int (structure, "height", (int *) &dec->height)) { swfdec_video_decoder_error (dec, "invalid caps on decoded buffer"); return; } buf = player->last; switch (swfdec_video_codec_get_format (dec->codec)) { case SWFDEC_VIDEO_FORMAT_RGBA: dec->plane[0] = buf->data; dec->rowstride[0] = dec->width * 4; break; case SWFDEC_VIDEO_FORMAT_I420: dec->plane[0] = buf->data; dec->rowstride[0] = SWFDEC_ALIGN (dec->width, 4); dec->plane[1] = dec->plane[0] + dec->rowstride[0] * SWFDEC_ALIGN (dec->height, 2); dec->rowstride[1] = SWFDEC_ALIGN (dec->width, 8) / 2; dec->plane[2] = dec->plane[1] + dec->rowstride[1] * SWFDEC_ALIGN (dec->height, 2) / 2; dec->rowstride[2] = dec->rowstride[1]; g_assert (dec->plane[2] + dec->rowstride[2] * SWFDEC_ALIGN (dec->height, 2) / 2 == dec->plane[0] + buf->size); break; default: g_return_if_reached (); } #undef SWFDEC_ALIGN }
static void swfdec_audio_decoder_gst_push (SwfdecAudioDecoder *dec, SwfdecBuffer *buffer) { SwfdecAudioDecoderGst *player = SWFDEC_AUDIO_DECODER_GST (dec); GstBuffer *buf; if (buffer == NULL) { swfdec_gst_decoder_push_eos (&player->dec); } else { swfdec_buffer_ref (buffer); buf = swfdec_gst_buffer_new (buffer); if (!swfdec_gst_decoder_push (&player->dec, buf)) swfdec_audio_decoder_error (dec, "error pushing"); } }
boost::uint8_t* AudioDecoderGst::decode(const boost::uint8_t* input, boost::uint32_t inputSize, boost::uint32_t& outputSize, boost::uint32_t& decodedData) { outputSize = decodedData = 0; GstBuffer* gstbuf = gst_buffer_new_and_alloc(inputSize); memcpy (GST_BUFFER_DATA (gstbuf), input, inputSize); bool success = swfdec_gst_decoder_push(&_decoder, gstbuf); if (!success) { log_error(_("AudioDecoderGst: buffer push failed.")); return 0; } decodedData = inputSize; return pullBuffers(outputSize); }