/* remove all formats from 'dest' that not either present in 'src'
or translatable from 'src'; assumes only a single audio format
and optionally a single video format will be present in 'src'
*/
unsigned int ast_translate_available_formats(unsigned int dest, unsigned int src)
{
unsigned int res = dest;
unsigned int x;
unsigned int src_audio = powerof(src & AST_FORMAT_AUDIO_MASK);
unsigned int src_video = powerof(src & AST_FORMAT_VIDEO_MASK);
for (x = 1; x < AST_FORMAT_MAX_AUDIO; x <<= 1) {
/* if this is not a desired format, nothing to do */
if (!dest & x)
continue;
/* if the source is supplying this format, then
we can leave it in the result */
if (src & x)
continue;
/* if we don't have a translation path from the src
to this format, remove it from the result */
if (!tr_matrix[src_audio][powerof(x)].step)
dest &= ~x;
}
/* roll over into video formats */
for (; x < AST_FORMAT_MAX_VIDEO; x <<= 1) {
/* if this is not a desired format, nothing to do */
if (!dest & x)
continue;
/* if the source is supplying this format, then
we can leave it in the result */
if (src & x)
continue;
/* if we don't have a translation path from the src
to this format, remove it from the result */
if (!tr_matrix[src_video][powerof(x)].step)
dest &= ~x;
}
return res;
}