diff options
Diffstat (limited to 'ext/swfdec')
-rw-r--r-- | ext/swfdec/gstswfdec.c | 67 | ||||
-rw-r--r-- | ext/swfdec/gstswfdec.h | 5 |
2 files changed, 37 insertions, 35 deletions
diff --git a/ext/swfdec/gstswfdec.c b/ext/swfdec/gstswfdec.c index 2933db80..8d862a8d 100644 --- a/ext/swfdec/gstswfdec.c +++ b/ext/swfdec/gstswfdec.c @@ -70,7 +70,7 @@ GST_PAD_TEMPLATE_FACTORY (audio_template_factory, "width", GST_PROPS_INT(16), "depth", GST_PROPS_INT(16), "rate", GST_PROPS_INT(44100), - "channels", GST_PROPS_INT(1) + "channels", GST_PROPS_INT(2) ) ); @@ -496,8 +496,9 @@ printf("setting caps\n"); "video/raw", gst_props_new ( "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC ('R','G','B',' ')), - "width", GST_PROPS_INT (640), - "height", GST_PROPS_INT (480), + ///"width", GST_PROPS_INT (640), + //"height", GST_PROPS_INT (480), + "rate", GST_PROPS_INT(12), NULL))); gst_pad_try_set_caps (swfdec->audiopad, @@ -520,7 +521,7 @@ printf("adding pad\n"); gst_element_add_pad(element, swfdec->audiopad); } - ret = swf_parse(swfdec->state); + ret = swfdec_decoder_parse(swfdec->state); if(ret==SWF_NEEDBITS){ buf = gst_pad_pull(swfdec->sinkpad); if(GST_IS_EVENT(buf)){ @@ -537,15 +538,16 @@ printf("adding pad\n"); if(!GST_BUFFER_DATA(buf)){ printf("expected non-null buffer\n"); } - ret = swf_addbits(swfdec->state,GST_BUFFER_DATA(buf), - GST_BUFFER_SIZE(buf)); + ret = swfdec_decoder_addbits(swfdec->state, + GST_BUFFER_DATA(buf), GST_BUFFER_SIZE(buf)); } } if(ret==SWF_CHANGE){ - swfdec->width = swfdec->state->width; - swfdec->height = swfdec->state->height; - swfdec->interval = GST_SECOND / swfdec->state->rate; + swfdec_decoder_get_image_size(swfdec->state, + &swfdec->width, &swfdec->height); + swfdec_decoder_get_rate(swfdec->state, &swfdec->rate); + swfdec->interval = GST_SECOND / swfdec->rate; #if G_BYTE_ORDER == 4321 #define RED_MASK 0xff0000 #define GREEN_MASK 0x00ff00 @@ -604,20 +606,15 @@ printf("adding pad\n"); if(ret==SWF_IMAGE){ GstBuffer *newbuf = NULL; - int newsize = swfdec->state->width * swfdec->state->height * 3; + unsigned char *data; + int len; /* video stuff */ - if(swfdec->pool){ - newbuf = gst_buffer_new_from_pool(swfdec->pool, 0, 0); - } - if(!newbuf){ - newbuf = gst_buffer_new(); - GST_BUFFER_SIZE(newbuf) = newsize; - GST_BUFFER_DATA(newbuf) = g_malloc(newsize); - } - g_return_if_fail(GST_BUFFER_DATA(newbuf) != NULL); + newbuf = gst_buffer_new(); + GST_BUFFER_SIZE(newbuf) = swfdec->width * swfdec->height * 3; - memcpy(GST_BUFFER_DATA(newbuf),swfdec->state->buffer,newsize); + swfdec_decoder_get_image(swfdec->state, &data); + GST_BUFFER_DATA(newbuf) = data; swfdec->timestamp += swfdec->interval; GST_BUFFER_TIMESTAMP(newbuf) = swfdec->timestamp; @@ -625,15 +622,19 @@ printf("adding pad\n"); gst_pad_push(swfdec->videopad, newbuf); /* audio stuff */ - newbuf = gst_buffer_new(); - newsize = 2*44100.0/swfdec->state->rate; - GST_BUFFER_SIZE(newbuf) = newsize; - GST_BUFFER_DATA(newbuf) = g_malloc(newsize); - memcpy(GST_BUFFER_DATA(newbuf),swfdec->state->sound_buffer, - newsize); - GST_BUFFER_TIMESTAMP(newbuf) = swfdec->timestamp; - gst_pad_push(swfdec->audiopad, newbuf); + data = swfdec_decoder_get_sound_chunk(swfdec->state, &len); + while(data){ + newbuf = gst_buffer_new(); + + GST_BUFFER_SIZE(newbuf) = len; + GST_BUFFER_DATA(newbuf) = data; + GST_BUFFER_TIMESTAMP(newbuf) = swfdec->timestamp; + + gst_pad_push(swfdec->audiopad, newbuf); + + data = swfdec_decoder_get_sound_chunk(swfdec->state, &len); + } } if(ret==SWF_EOF){ @@ -670,10 +671,10 @@ gst_swfdec_init (GstSwfdec *swfdec) gst_element_set_loop_function(GST_ELEMENT(swfdec), gst_swfdec_loop); /* initialize the swfdec decoder state */ - swfdec->state = swf_init(); + swfdec->state = swfdec_decoder_new(); g_return_if_fail(swfdec->state != NULL); - swfdec->state->colorspace = SWF_COLORSPACE_RGB888; + swfdec_decoder_set_colorspace(swfdec->state, SWF_COLORSPACE_RGB888); GST_FLAG_SET (GST_ELEMENT (swfdec), GST_ELEMENT_EVENT_AWARE); } @@ -684,7 +685,7 @@ gst_swfdec_dispose (GObject *object) //GstSwfdec *swfdec = GST_SWFDEC (object); /* FIXME */ - //swf_state_free(swfdec->state); + //swfdec_decoder_free(swfdec->state); G_OBJECT_CLASS (parent_class)->dispose (object); } @@ -737,7 +738,7 @@ gst_swfdec_chain (GstPad *pad, GstBuffer *buf) /* fprintf(stderr, "SWFDEC: in timestamp=%llu\n",GST_BUFFER_TIMESTAMP(buf)); */ /* fprintf(stderr, "SWFDEC: have buffer of %d bytes\n",size); */ - ret = swf_addbits(swfdec->state, data, size); + ret = swfdec_decoder_addbits(swfdec->state, data, size); if(ret==SWF_IMAGE){ @@ -1010,7 +1011,7 @@ gst_swfdec_change_state (GstElement *element) case GST_STATE_READY_TO_PAUSED: { //gst_swfdec_vo_open (swfdec); - //swf_init (swfdec->decoder, swfdec->accel, swfdec->vo); + //swfdec_decoder_new (swfdec->decoder, swfdec->accel, swfdec->vo); //swfdec->decoder->is_sequence_needed = 1; //swfdec->decoder->frame_rate_code = 0; diff --git a/ext/swfdec/gstswfdec.h b/ext/swfdec/gstswfdec.h index fe059389..38f58e88 100644 --- a/ext/swfdec/gstswfdec.h +++ b/ext/swfdec/gstswfdec.h @@ -24,7 +24,7 @@ #include <config.h> #include <gst/gst.h> -#include <swf.h> +#include <swfdec.h> #ifdef __cplusplus extern "C" { @@ -54,12 +54,13 @@ struct _GstSwfdec { GstPad *audiopad; GstBufferPool *pool; - swf_state_t *state; + SwfdecDecoder *state; gboolean closed; /* the timestamp of the next frame */ gboolean first; + double rate; gint64 timestamp; gint64 interval; gdouble frame_rate; |