上一页 1 ··· 52 53 54 55 56 57 58 59 60 ··· 71 下一页
摘要: 这里需要描述一下gst_pad_get_caps/gst_pad_set_getcaps_function, gst_pad_set_caps/gst_pad_set_setcaps_function这四个函数。gst_pad_get_caps函数用来返回该pad能接受的caps。这个函数的逻辑是:首先检查getcaps函数指针是否为NULL,如果不是则调用getcaps函数,这是一个函数指针,我们可以通过gst_pad_set_getcaps_function来给这个函数指针赋值,从而实现自定义的get_caps函数的逻辑。完成后函数返回;如果getcaps函数指针为NULL,则gst_pa 阅读全文
posted @ 2011-01-03 11:28 super119 阅读(1901) 评论(1) 推荐(0) 编辑
摘要: 来看这个函数:gst_rtp_buffer_compare_seqnumCODE:SELECT ALLgintgst_rtp_buffer_compare_seqnum (guint16 seqnum1, guint16 seqnum2){ return (gint16) (seqnum2 - seqnum1);}就简单的一句代码,就能判断出seqnum1, seqnum2是否有wraparound的现象。关键点就在于return后面的gint16类型转换上。seqnum1, seqnum2都是guint16,也就是unsigned short,而返回值被强制转换成了gint16,也就是sig 阅读全文
posted @ 2011-01-03 11:28 super119 阅读(862) 评论(0) 推荐(0) 编辑
摘要: 想让xvimagesink/ximagesink这样的element在我们指定的窗口中绘制video?简单的很:1. new一个GtkDrawingArea2. connect它的expose-event signal,e.g:// Drawing on our drawing areag_signal_connect(G_OBJECT(area), "expose-event", G_CALLBACK(expose_cb), NULL);3. 书写callback函数expose_cb,e.g:[代码]这样就OK了。expose-event是drawingarea每次重绘的时候会发出的sig 阅读全文
posted @ 2011-01-03 11:27 super119 阅读(1527) 评论(0) 推荐(0) 编辑
摘要: 1. 获取duration的话,有几个途径:(1)在bus上监听GST_MESSAGE_DURATION,如果有这个消息到来,用gst_message_parse_duration就可以获得。但是往往element不会发这样的message出来 (2)用gst_query_new_duration新建一个duration query,然后用gst_element_query(pipeline, query)查询即可。这种方法较为常用。一般可以在pipeline所有element都link好了,pipeline状态是RUNNING的时候,就可以查询了。2. 获取当前播放的position,也有几 阅读全文
posted @ 2011-01-03 11:26 super119 阅读(1184) 评论(0) 推荐(0) 编辑
摘要: g_closure_marshal提供了一些常用的closure的实现,但是由于返回值和参数列表的可能性实在太多,无法穷举,所以,gobject提供了一个程序:glib-genmarshal来帮我们生成指定的closure的实现(自动生成代码)。在当前目录下创建一个文件,比如:marshal.list,包含内容如下:VOID:UINT,UINT就是返回值和参数列表。然后:glib-genmarshal --header --prefix=gst_play_marshal marshal.list这样就生成了头文件的内容,保存下来存成gstplay-marshal.h,搞定。glib-genma 阅读全文
posted @ 2011-01-03 11:26 super119 阅读(982) 评论(0) 推荐(0) 编辑
摘要: [代码] 阅读全文
posted @ 2011-01-03 11:25 super119 阅读(1282) 评论(0) 推荐(0) 编辑
摘要: GstPipeline在从PAUSED转成PLAYING的时候,会select一个clock并计算出basetime,这两样东西都会赋给pipeline中每个element。那这个basetime每次是怎么计算的呢?原来认为这个basetime就是当前的clock time,但是后来发现不对。比如:在播放了2秒的时候PAUSE,等了3秒后再PLAY,此时如果这个basetime是当前时间的话,那就是5秒时刻,此时继续播放的话,会发现传过来的buffer中的timestamp是从第3秒开始的,不是从0秒开始的,因为上次暂停的时候是在2秒的时间点上。所以如果此时basetime是5秒的话,那么si 阅读全文
posted @ 2011-01-03 11:21 super119 阅读(1262) 评论(0) 推荐(1) 编辑
摘要: aplay -t raw -c 1 -f S16_LE -r 8000 test2.pcm-t: type raw表示是PCM-c: channel 1-f S16_LE: Signed 16bit-width Little-Endian-r: sample rate 8000PCM是最raw的音频数据,没有任何头信息。WAV文件就是PCM+头信息,头信息就是上述的声道数,sample rate这些。所以WAV文件可以直接播放,而PCM需要手动指定这些信息之后才能播放。 阅读全文
posted @ 2011-01-03 11:20 super119 阅读(3391) 评论(0) 推荐(1) 编辑
摘要: 看了MP4Box的源码,后来对照代码参看了H.263的Specification,取宽高的 方法如下:1. 读前22个bit(不是byte),然后转成int,这个值应该是32(0x20)。这是H.263 stream的start code,表示这是一个H.263的stream2. 读第36-38bit,转成int,这个值就表示该263 stream的format,对应表如下:[代码]具体到宽高,这里直接引用MP4Box中的代码(变量fmt就是36-38bit表示的值):staticvoidh263_get_pic_size(GF_BitStream*bs,u32fmt,u32*w,u32*h) 阅读全文
posted @ 2011-01-03 11:18 super119 阅读(922) 评论(8) 推荐(0) 编辑
摘要: Linux可以让多个设备共享一个中断号,而且共享同一中断的中断处理程序形成一个链表,内核对每个中断处理程序都要执行,那么,没有产生中断的设备本该靠边站的,它的中断处理程序也被执行了?到底是怎么会事?实际上:共享的处理程序与非共享的处理程序在注册和运行方式上比较相似,但差异主要有以下三处:* request_irq()的参数flags必须设置SA_SHIRQ标志。* 对每个注册的中断处理程序来说,dev_id参数必须唯一。指向任一设备结构的指针就可以满足这一要求;通常会选择设备结构,因为它是唯一的,而且中断处理程序可能会用到它。不能给共享的处理程序传递NULL值。* 中断处理程序必须能够区分它的 阅读全文
posted @ 2011-01-03 11:16 super119 阅读(694) 评论(0) 推荐(0) 编辑
上一页 1 ··· 52 53 54 55 56 57 58 59 60 ··· 71 下一页