<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <meta http-equiv="Content-Style-Type" content="text/css" />
  <meta name="generator" content="pandoc" />
  <title></title>
  <style type="text/css">code{white-space: pre;}</style>
</head>
<body>
<p>Hi Steve,</p>
<p>On 2017-05-12 17:32, Steve Lhomme wrote:</p>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> On Fri, May 12, 2017 at 4:31 PM, Rémi Denis-Courmont <remi@remlab.net> wrote:</code></pre>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> Le torstaina 11. toukokuuta 2017, 9.36.07 EEST Steve Lhomme a écrit :</code></pre>
<blockquote style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;color:#500050">
<pre><code> ---
  include/vlc_fourcc.h | 2 ++
  1 file changed, 2 insertions(+)

 diff --git a/include/vlc_fourcc.h b/include/vlc_fourcc.h
 index b950b0622b..d6a2c5085e 100644
 --- a/include/vlc_fourcc.h
 +++ b/include/vlc_fourcc.h
 @@ -24,6 +24,8 @@
  #ifndef VLC_FOURCC_H
  #define VLC_FOURCC_H 1

 +#define FOURCC_STR(fc) ((const char *)&(fc))
 +
  /* Video codec */
  #define VLC_CODEC_MPGV            VLC_FOURCC('m','p','g','v')
  #define VLC_CODEC_MP4V            VLC_FOURCC('m','p','4','v')</code></pre>
</blockquote>
<pre><code> This is hugely misleading as the result is not nul-terminated. Nack.</code></pre>
</blockquote>
<pre><code> I have a less misleading one:

 /* use this macro with a %4.4s string formating */
 #define FOURCC_44S(fc) ((fc) ? (const char *)&(fc) : "NULL")

 That avoids the ugly logs wherever we use %4.4s for a chroma/codec
 that may be 0.</code></pre>
</blockquote>
<p>As already stated a few days ago, I do not see how the original macro is helpful, nor the now proposed version. If one really wants such a helper that you seem to be after, I would recommend doing something as the below.</p>
<pre><code>#define VLC_FOURCC_STR(fcc) \
    ( fcc == 0 ? "N/A" : (char const*)&(char const[5]){ \
        ((char*)&fcc)[0], \
        ((char*)&fcc)[1], \
        ((char*)&fcc)[2], \
        ((char*)&fcc)[3], 0 } \
    )</code></pre>
<p>Allowing for the below:</p>
<pre><code>vlc_fourcc_t foo = VLC_FOURCC( 't', 'i', 'h', 'i' );
vlc_fourcc_t bar = 0;

msg_Dbg( "foo: %s, bar: %s",
  VLC_FOURCC_STR( foo ),
  VLC_FOURCC_STR( bar ) ); /* foo: tihi, bar: N/A */</code></pre>
<p>Notes:</p>
<ul>
<li><p>If, for some reason, you also want to have support for <code>VLC_FOURCC_STR( VLC_FOURCC( ... ) )</code> you would of course have to modify the above to support <em>rvalues</em>.</p></li>
<li><p>The proposed macro is, of course, only usable from <em>C</em> (an alternative implementation needs to be written for <em>C++</em>).</p></li>
<li>If one wants it in the codebase, one should elaborate it with either;
<ul>
<li><code>_Generic</code> to prevent it being used with the wrong source-type, or;</li>
<li>conditionally ill-formed <em>constant-expression</em> to fail compilation if <code>sizeof(fcc) < 4</code>.</li>
</ul></li>
</ul>
<p>Best Regards,<br />
Filip</p>
</body>
</html>