diff options
author | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2003-05-30 23:05:29 +0000 |
---|---|---|
committer | Ronald S. Bultje <rbultje@ronald.bitfreak.net> | 2003-05-30 23:05:29 +0000 |
commit | 04b611b88ce9aec269a0f79f216fae2e39eb4b7b (patch) | |
tree | 282ae652530064b074a68d3b2000b602968ffa8d /gst/avi | |
parent | e11972656a87a0d5a96ee1d887ba14a85a27a116 (diff) |
Fix avimux (somewhat). Note: the EOS event still doesn't get through. This is completely braindead, I have no clue wh...
Original commit message from CVS:
Fix avimux (somewhat). Note: the EOS event still doesn't get through. This is completely braindead, I have no clue why, but setting this thing to PAUSE should do the trick too. EOS fix will come later on...
Diffstat (limited to 'gst/avi')
-rw-r--r-- | gst/avi/gstavimux.c | 47 | ||||
-rw-r--r-- | gst/avi/gstavimux.h | 1 |
2 files changed, 39 insertions, 9 deletions
diff --git a/gst/avi/gstavimux.c b/gst/avi/gstavimux.c index 611f2550..efdd1159 100644 --- a/gst/avi/gstavimux.c +++ b/gst/avi/gstavimux.c @@ -81,12 +81,12 @@ GST_PAD_TEMPLATE_FACTORY (video_sink_factory, GST_PAD_SINK, GST_PAD_REQUEST, GST_CAPS_NEW ( - "avimux_sink_video", + "avimux_sink_video_avi", "video/avi", "format", GST_PROPS_STRING ("strf_vids") ), GST_CAPS_NEW ( - "avimux_sink_video", + "avimux_sink_video_yuv", "video/raw", "format", GST_PROPS_LIST ( GST_PROPS_FOURCC (GST_MAKE_FOURCC('Y','U','Y','2')), @@ -97,7 +97,7 @@ GST_PAD_TEMPLATE_FACTORY (video_sink_factory, "height", GST_PROPS_INT_RANGE (16, 4096) ), GST_CAPS_NEW ( - "avimux_sink_video", + "avimux_sink_video_rgb", "video/raw", "format", GST_PROPS_FOURCC (GST_MAKE_FOURCC('R','G','B',' ')), "width", GST_PROPS_INT_RANGE (16, 4096), @@ -116,10 +116,22 @@ GST_PAD_TEMPLATE_FACTORY (video_sink_factory, ) ), GST_CAPS_NEW ( - "avimux_sink_video", + "avimux_sink_video_jpeg", "video/jpeg", "width", GST_PROPS_INT_RANGE (16, 4096), "height", GST_PROPS_INT_RANGE (16, 4096) + ), + GST_CAPS_NEW ( + "avimux_sink_video_divx", + "video/divx", + "width", GST_PROPS_INT_RANGE (16, 4096), + "height", GST_PROPS_INT_RANGE (16, 4096) + ), + GST_CAPS_NEW ( + "avimux_sink_video_xvid", + "video/xvid", + "width", GST_PROPS_INT_RANGE (16, 4096), + "height", GST_PROPS_INT_RANGE (16, 4096) ) ) @@ -390,14 +402,24 @@ gst_avimux_sinkconnect (GstPad *pad, GstCaps *vscaps) break; } } - else if (!strcmp (mimetype, "video/jpeg")) + else if (!strcmp (mimetype, "video/jpeg") || + !strcmp (mimetype, "video/xvid") || + !strcmp (mimetype, "video/divx")) { avimux->vids.size = sizeof(gst_riff_strf_vids); gst_caps_get (caps, "width", &avimux->vids.width, "height", &avimux->vids.height, NULL); avimux->vids.planes = 1; avimux->vids.bit_cnt = 24; - avimux->vids_hdr.fcc_handler = avimux->vids.compression = GST_MAKE_FOURCC('M','J','P','G'); + + if (!strcmp (mimetype, "video/jpeg")) + avimux->vids.compression = GST_MAKE_FOURCC('M','J','P','G'); + else if (!strcmp (mimetype, "video/divx")) + avimux->vids.compression = GST_MAKE_FOURCC('D','I','V','X'); + else if (!strcmp (mimetype, "video/xvid")) + avimux->vids.compression = GST_MAKE_FOURCC('X','V','I','D'); + + avimux->vids_hdr.fcc_handler = avimux->vids.compression; avimux->avi_hdr.width = avimux->vids.width; avimux->avi_hdr.height = avimux->vids.height; avimux->vids.image_size = avimux->vids.height * avimux->vids.width; @@ -921,6 +943,7 @@ gst_avimux_start_file (GstAviMux *avimux) avimux->num_frames = 0; avimux->numx_frames = 0; avimux->audio_size = 0; + avimux->audio_time = 0; avimux->avix_start = 0; avimux->idx_index = 0; @@ -980,7 +1003,7 @@ gst_avimux_stop_file (GstAviMux *avimux) if (avimux->audio_pad_connected) { /* calculate bps if needed */ if (!avimux->auds.av_bps) { - g_warning("Bps calculation needed!"); + avimux->auds.av_bps = GST_SECOND * ((1. * avimux->audio_size) / avimux->audio_time); avimux->auds_hdr.rate = avimux->auds.av_bps * avimux->auds_hdr.scale; } avimux->avi_hdr.max_bps += avimux->auds.av_bps; @@ -1133,6 +1156,7 @@ gst_avimux_do_audio_buffer (GstAviMux *avimux) { avimux->data_size += total_size; avimux->audio_size += GST_BUFFER_SIZE(data); + avimux->audio_time += GST_BUFFER_DURATION(data); gst_avimux_add_index(avimux, "01wb", 0x0, total_size); } @@ -1223,8 +1247,14 @@ gst_avimux_do_one_buffer (GstAviMux *avimux) else gst_avimux_do_audio_buffer(avimux); } - else + else { + /* simply finish off the file and send EOS */ + gst_avimux_stop_file(avimux); + gst_pad_push(avimux->srcpad, + GST_BUFFER(gst_event_new(GST_EVENT_EOS))); + gst_element_set_eos(GST_ELEMENT(avimux)); return FALSE; + } return TRUE; } @@ -1313,7 +1343,6 @@ gst_avimux_change_state (GstElement *element) case GST_STATE_PLAYING_TO_PAUSED: /* this function returns TRUE while it handles buffers */ while (gst_avimux_do_one_buffer(avimux)); - gst_avimux_stop_file(avimux); break; case GST_STATE_PAUSED_TO_READY: break; diff --git a/gst/avi/gstavimux.h b/gst/avi/gstavimux.h index 794cf617..c2333a04 100644 --- a/gst/avi/gstavimux.h +++ b/gst/avi/gstavimux.h @@ -69,6 +69,7 @@ struct _GstAviMux { gboolean write_header; gboolean restart; guint32 audio_size; + guint64 audio_time; /* video header */ gst_riff_strh vids_hdr; |