int es_info_print(elementary_stream_info_t *es, int level, char *str, size_t str_len) 
{ 
   if (es == NULL || str == NULL || str_len < 2 || tslib_loglevel < TSLIB_LOG_LEVEL_INFO) return 0; 
   int bytes = 0; 
   
   bytes += SKIT_LOG_UINT_VERBOSE(str + bytes, level, es->stream_type, stream_desc(es->stream_type), str_len - bytes); 
   bytes += SKIT_LOG_UINT_HEX(str + bytes, level, es->elementary_PID, str_len - bytes); 
   bytes += SKIT_LOG_UINT(str + bytes, level, es->ES_info_length, str_len - bytes); 
   
   bytes += print_descriptor_loop(es->descriptors, level + 1, str + bytes, str_len - bytes); 
   return bytes;
}
int language_descriptor_print(const descriptor_t *desc, int level, char* str, size_t str_len) {
	int bytes = 0;
	if (desc == NULL)
		return 0;
	if (desc->tag != ISO_639_LANGUAGE_DESCRIPTOR)
		return 0;

	language_descriptor_t *ld = (language_descriptor_t*) desc;

	bytes += SKIT_LOG_UINT_VERBOSE( str + bytes, level, desc->tag, "ISO_639_language_descriptor", str_len - bytes );
	bytes += SKIT_LOG_UINT( str + bytes, level, desc->length, str_len - bytes);

	if (ld->_num_languages > 0) {
		for (int i = 0; i < ld->_num_languages; i++) {
			bytes += SKIT_LOG_STR( str + bytes, level, ld->languages[i].ISO_639_language_code, str_len - bytes);
			bytes += SKIT_LOG_UINT( str + bytes, level, ld->languages[i].audio_type, str_len - bytes);
		}
	}

	return bytes;
}