<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
margin-bottom:.0001pt;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}
span.EmailStyle17
{mso-style-type:personal-compose;
font-family:"Calibri",sans-serif;
color:windowtext;}
.MsoChpDefault
{mso-style-type:export-only;
font-family:"Calibri",sans-serif;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
{page:WordSection1;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72">
<div class="WordSection1">
<p class="MsoNormal">I’m creating a custom video decoder for ffmpeg. The code compiles and links, my codec library is included. However, when I attempt to play my file, the player (Nova player for Android though that shouldn’t matter) doesn’t find the decoder.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The decoder is for a matroska container and the stream is correctly tagged in the file. The error message through the app says “Cannot play video. This video format (s_none) is not supported.”<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I’ve reviewed the ffmpeg custom codec docs. My starting point was an existing codec. Does my code appear to be the correct way to register a customer codec?<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Here are the places I modified libavcodec/libavformat code…<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">libavformat/matroska.c<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">const CodecTags ff_mkv_codec_tags[]={<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> {"A_AAC" , AV_CODEC_ID_AAC},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> {"A_AC3" , AV_CODEC_ID_AC3},<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">…<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> {"S_MKV/LANDMARK" , AV_CODEC_ID_MPLM}, ///<<< my codec<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> {"" , AV_CODEC_ID_NONE}<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">};<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">libavcodec/allcodecs.c<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">extern AVCodec ff_libmplm_decoder;<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">libavcodec/avcodec.h<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">enum AVCodecID {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> AV_CODEC_ID_NONE,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">…<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> AV_CODEC_ID_WRAPPED_AVFRAME = 0x21001, ///< Passthrough codec, AVFrames wrapped in AVPacket<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> AV_CODEC_ID_MPLM = 0x30000, ///< MediaPipe Landmark decoder<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">};<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">libavcodec/codec_desc.c<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">static const AVCodecDescriptor codec_descriptors[] = {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> /* video codecs */<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">…<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .id = AV_CODEC_ID_MPLM,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .type = AVMEDIA_TYPE_VIDEO,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .name = "mediapipe_landmark",<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .long_name = NULL_IF_CONFIG_SMALL("MediaPipe Landmark")<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> },<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">};<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">In my decoder…<o:p></o:p></p>
<p class="MsoNormal">libavcodec/libmplmdec.c<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">…<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">AVCodec ff_mplm_decoder = {<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .name = LANDMARK_CODEC_NAME,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .long_name = NULL_IF_CONFIG_SMALL("MediaPipe Landmark decoder"),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .type = AVMEDIA_TYPE_VIDEO,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .id = AV_CODEC_ID_MPLM,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .priv_data_size = sizeof(MPLMContext),<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .init = mplm_decode_init,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .close = mplm_decode_end,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .decode = mplm_decode_frame,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .capabilities = AV_CODEC_CAP_DR1,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""> .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">};<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New""><o:p> </o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">// fmt, subfmt, w, h, cpu, dec, name, mangler<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">STREAM_REGISTER_DEC_VIDEO( VIDEO_FORMAT_MJPG, 0, MAXW, MAXH, MPLMHW, new_dec, LANDMARK_CODEC_NAME, 0 );<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">libavcodec/libmplmdec.h<o:p></o:p></p>
<p class="MsoNormal"><span style="font-family:"Courier New"">#define LANDMARK_CODEC_NAME "S_MKV/LANDMARK"<o:p></o:p></span></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">--<o:p></o:p></p>
<p class="MsoNormal">Tim Fleming<o:p></o:p></p>
<p class="MsoNormal">tim@magichome.net<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
</body>
</html>