1. 程式人生 > >AVDictionary結構體相關原始碼介紹

AVDictionary結構體相關原始碼介紹

本文對AVDictionary結構體部分相關函式程式碼進行了介紹

本文研究分析AVDictionary相關程式碼

 struct AVDictionary {
     int count;
     AVDictionaryEntry *elems;
 };

typedef struct AVDictionaryEntry {
    char *key;
    char *value;
} AVDictionaryEntry;
/*
 *這就是一個鍵值對或者叫鍵值對陣列。為了create一個AVDictionary,
 *用到了av_dict_set()函式,將一個空指標傳入該函式,這個空指標為
 *空的AVDictionary。生成AVDictionary後,可以通過av_dict_get()函
 *來找回一個數組或者遞迴所有陣列,最後用av_dict_free()來釋放。
 */
	AVDictionary *d = NULL;           // "create" an empty dictionary
	AVDictionaryEntry *t = NULL;
	av_dict_set(&d, "foo", "bar", 0); // add an entry
	char *k = av_strdup("key");       // if your strings are already allocated,
	char *v = av_strdup("value");     // you can avoid copying them like this
	av_dict_set(&d, k, v, AV_DICT_DONT_STRDUP_KEY | AV_DICT_DONT_STRDUP_VAL);
	while (t = av_dict_get(d, "", t, AV_DICT_IGNORE_SUFFIX)) {
	    <....>                             // iterate over all entries in d
	}
	av_dict_free(&d);
	
	/*
	 *介紹主要函式
	 */
	/*
	 *這個函式是把給定的key/value放入*pm中,如果陣列已存在則覆蓋
	 *Note:增加一個新的陣列到dictionary中會使之前由av_dict_get()返回的陣列失效
	 *  pm   指向一個dictionary的指標的指標。如果*pm是空,那麼一個dictionary結構將
	 *       由函式分配並放入*pm
	 *  key  陣列中的key值要加入*pm,由av_strduped設定一個值或者根據一個flag增加
	 *  value 陣列中的value值要加入*pm,由av_strduped設定一個值或者根據一個flag增加
	 *
	 *  函式成功執行返回0,否則返回<0
	*/
		 int av_dict_set	(	AVDictionary ** 	pm,
	        const char * 	key,
	        const char * 	value,
	        int 	flags )		
	  
	 /*
	  *通過匹配的key值得到一個dictionary entry,返回的entry key或value值不能被修改
	  *為遞迴所有dictionary entry,可以set the matching key to null,並且set the 
	  *AV_DICT_IGNORE_SUFFIX flag
	  *   prev  Set to the previous matching element to find the next.If set to null
	  *         the first matching element is returned
	  *   key   matching key
	  *   flags a collection of AV_DICT_ *flags,控制著如何檢索陣列
	  *
	  * 執行結果是:found entry or NULL in case no matching entry was found in the dictionary
	 */
		  AVDictionaryEntry* av_dict_get	(	const AVDictionary * 	m,
	                 const char * 	key,
	                 const AVDictionaryEntry * 	prev,
	                 int 	flags )	      
	  
	 /*
	  *對av_dict_set的一個包裝處理,將其引數value轉換成一個string型別並存儲下來
	  */ 
	     int av_dict_set_int	(	AVDictionary ** 	pm,
                    const char * 	key,
                    int64_t 	value,
                    int 	flags )	
<pre name="code" class="cpp">/*
	  *拷貝entries從一個AVDictionary到另一個AVDictionary
	  *   dst   指向一個AVDictionary結構體
	  *   src   指向原AVDictionary結構體
	  *   flag  在set dst中的entries時用到
	  *   成功返回0,失敗返回負。
	  */ 
	  int av_dict_copy	(	AVDictionary ** 	dst,
               const AVDictionary * 	src,
               int 	flags )