<p>What are the pros / cons of using <code>pthread_cond_wait</code> or using a semaphore ?
I am waiting for a state change like this :</p>

<pre><code>pthread_mutex_lock(&amp;cam-&gt;video_lock);
while(cam-&gt;status == WAIT_DISPLAY) {
    pthread_cond_wait(&amp;cam-&gt;video_cond, &amp;cam-&gt;video_lock);
}
pthread_mutex_unlock(&amp;cam-&gt;video_lock);
</code></pre>

<p>Using a properly initialised semaphore, I think I could do it like this :</p>

<pre><code>while(cam-&gt;status == WAIT_DISPLAY) {
    sem_wait(&amp;some_semaphore);
}
</code></pre>

<p>What are the pros and cons of each method ?</p>

In your second snippet, you're getting the lock multitude of times, never releasing it.
In general, the state you're waintin on can be completely expressed by a semaphore, then you can use just that.  A lock structure is smaller in size, and it requires less atomic operations to check/set/release.
Otherwise, if the state is complex, and different parts of the code wait on different conditions of the same variable (eg, here you want x<10; there you want y>x), use cond_wait.