<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="https://blog.avblocks.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.avblocks.com/" rel="alternate" type="text/html" hreflang="en" /><updated>2024-05-11T13:29:14-07:00</updated><id>https://blog.avblocks.com/feed.xml</id><title type="html">AVBlocks™</title><subtitle>&amp;copy; Primo Software</subtitle><author><name>Primo Software</name></author><entry><title type="html">How to configure output socket for MP3 encoding in .NET</title><link href="https://blog.avblocks.com/how-to-configure-output-socket-mp3-encoding-net/" rel="alternate" type="text/html" title="How to configure output socket for MP3 encoding in .NET" /><published>2024-05-11T00:00:00-07:00</published><updated>2024-05-11T00:00:00-07:00</updated><id>https://blog.avblocks.com/how-to-configure-output-socket-mp3-encoding-net</id><content type="html" xml:base="https://blog.avblocks.com/how-to-configure-output-socket-mp3-encoding-net/"><![CDATA[<p>Here is a quick snippet for configuring the output socket of a <a href="https://doc.avblocks.com/net/latest/class_primo_software_1_1_a_v_blocks_1_1_transcoder.html">Transcoder</a> for MP3 encoding using C#.</p>

<h2 id="diagram">Diagram</h2>

<pre><code class="language-mermaid">flowchart TB
    is("&lt;b&gt;MediaSocket&lt;/b&gt;\nFile: input.wav")
    os("&lt;b&gt;MediaSocket&lt;/b&gt;\nType: MpegAudio\nSubtype: MpegAudioLayer3\nFile: output.mp3")
    tr("&lt;b&gt;Transcoder Block&lt;/b&gt;\nopen\nrun\nclose")
    out["output.mp3"]

    in["input.wav"]
    out["output.mp3"]

    is --&gt; |"add input"| tr 
    os --&gt; |"add output"| tr
    
    in  --&gt; |"read"| tr --&gt; |"write"| out
</code></pre>

<h2 id="code">Code</h2>

<p>This is the code for the output socket:</p>

<pre><code class="language-csharp">static MediaSocket CreateOutputSocket(Options opt)
{
    AudioStreamInfo asi = new AudioStreamInfo();
    asi.StreamType = StreamType.MpegAudio;
    asi.StreamSubType = StreamSubType.MpegAudioLayer3;

    // The default bitrate is 128000. You can set it to 192000, 256000, etc.
    // asi.Bitrate = 192000;

    // You can change the sampling rate and the number of the channels
    // asi.SampleRate = 44100;
    // asi.Channels = 1;

    MediaPin pin = new MediaPin();
    pin.StreamInfo = asi;

    MediaSocket socket = new MediaSocket();
    socket.StreamType = StreamType.MpegAudio;
    socket.StreamSubType = StreamSubType.MpegAudioLayer3;

    socket.Pins.Add(pin);

    // output to a file
    socket.File = opt.OutputFile;

    return socket;
}
</code></pre>

<p>The complete program is available on <a href="https://github.com/avblocks/avblocks-net">GitHub</a>:</p>

<ul>
  <li><a href="https://github.com/avblocks/avblocks-net/tree/main/samples/enc_mp3_file">enc_mp3_file</a></li>
</ul>]]></content><author><name>Primo Software</name></author><category term="tips-and-tricks" /><category term="audio" /><category term="encoder" /><category term="mp3" /><category term=".net" /><summary type="html"><![CDATA[Here is a quick snippet for configuring the output socket of a Transcoder for MP3 encoding using C#. Diagram flowchart TB is("&lt;b&gt;MediaSocket&lt;/b&gt;\nFile: input.wav") os("&lt;b&gt;MediaSocket&lt;/b&gt;\nType: MpegAudio\nSubtype: MpegAudioLayer3\nFile: output.mp3") tr("&lt;b&gt;Transcoder Block&lt;/b&gt;\nopen\nrun\nclose") out["output.mp3"] in["input.wav"] out["output.mp3"] is --&gt; |"add input"| tr os --&gt; |"add output"| tr in --&gt; |"read"| tr --&gt; |"write"| out]]></summary></entry><entry><title type="html">How to configure output socket for AAC / ADTS encoding in C++</title><link href="https://blog.avblocks.com/how-to-configure-output-socket-aac-adts-encoding-cpp/" rel="alternate" type="text/html" title="How to configure output socket for AAC / ADTS encoding in C++" /><published>2024-05-08T00:00:00-07:00</published><updated>2024-05-08T00:00:00-07:00</updated><id>https://blog.avblocks.com/how-to-configure-output-socket-aac-adts-encoding-cpp</id><content type="html" xml:base="https://blog.avblocks.com/how-to-configure-output-socket-aac-adts-encoding-cpp/"><![CDATA[<p>Here is a quick snippet for configuring the output socket of a <a href="https://doc.avblocks.com/cpp/latest/classprimo_1_1avblocks_1_1_transcoder.html">Transcoder</a> for Advanced Audio Coding (AAC) / Audio Data Transport Stream (ADTS) encoding using C++.</p>

<h2 id="diagram">Diagram</h2>

<pre><code class="language-mermaid">flowchart TB
    is("&lt;b&gt;MediaSocket&lt;/b&gt;\nFile: input.wav")
    os("&lt;b&gt;MediaSocket&lt;/b&gt;\nType: AAC\nSubtype: AAC_ADTS\nFile: output.aac")
    tr("&lt;b&gt;Transcoder Block&lt;/b&gt;\nopen\nrun\nclose")

    in["input.wav"]
    out["output.aac"]

    is --&gt; |"add input"| tr 
    os --&gt; |"add output"| tr
    
    in  --&gt; |"read"| tr --&gt; |"write"| out
</code></pre>

<h2 id="code">Code</h2>

<p>This is the code for the output socket:</p>

<pre><code class="language-cpp">primo::ref&lt;MediaSocket&gt; createOutputSocket(Options&amp; opt)
{
    // create stream info to describe the output audio stream
    auto asi = primo::make_ref(Library::createAudioStreamInfo());
    asi-&gt;setStreamType(StreamType::MPEG_Audio);
    asi-&gt;setStreamSubType(StreamSubType::MPEG_Audio_Layer3);

    // The default bitrate is 128000. You can set it to 192000, 256000, etc.
    // asi-&gt;setBitrate(192000);

    // Optionally set the sampling rate and the number of the channels, e.g. 44.1 Khz, Mono 
    // asi-&gt;setSampleRate(44100);
    // asi-&gt;setChannels(1);

    // create a pin using the stream info 
    auto pin = primo::make_ref(Library::createMediaPin());
    pin-&gt;setStreamInfo(asi.get());

    // the pin allows you to specify additional parameters for the encoder 
    // for example, change the stereo mode, e.g. Joint Stereo
    // pin-&gt;params()-&gt;addInt(Param::Encoder::Audio::MPEG1::StereoMode, StereoMode::Joint);

    // finally create a socket for the output container format which is MP3 in this case
    auto socket = primo::make_ref(Library::createMediaSocket());
    socket-&gt;setStreamType(StreamType::MPEG_Audio);
    socket-&gt;setStreamSubType(StreamSubType::MPEG_Audio_Layer3);

    socket-&gt;pins()-&gt;add(pin.get());

    // output to a file
    auto output_file = primo::ustring(opt.outputFile);
    socket-&gt;setFile(output_file);

    return socket;
}
</code></pre>

<p>The complete program is available on <a href="https://github.com/avblocks/avblocks-cpp">GitHub</a>:</p>

<ul>
  <li><a href="https://github.com/avblocks/avblocks-cpp/blob/main/samples/darwin/enc_aac_adts_file">enc_aac_adts_file (macOS)</a></li>
  <li><a href="https://github.com/avblocks/avblocks-cpp/blob/main/samples/linux/enc_aac_adts_file">enc_aac_adts_file (Linux)</a></li>
  <li><a href="https://github.com/avblocks/avblocks-cpp/blob/main/samples/windows/enc_aac_adts_file">enc_aac_adts_file (Windows)</a></li>
</ul>]]></content><author><name>Primo Software</name></author><category term="tips-and-tricks" /><category term="audio" /><category term="encoder" /><category term="aac" /><category term="adts" /><summary type="html"><![CDATA[Here is a quick snippet for configuring the output socket of a Transcoder for Advanced Audio Coding (AAC) / Audio Data Transport Stream (ADTS) encoding using C++. Diagram flowchart TB is("&lt;b&gt;MediaSocket&lt;/b&gt;\nFile: input.wav") os("&lt;b&gt;MediaSocket&lt;/b&gt;\nType: AAC\nSubtype: AAC_ADTS\nFile: output.aac") tr("&lt;b&gt;Transcoder Block&lt;/b&gt;\nopen\nrun\nclose") in["input.wav"] out["output.aac"] is --&gt; |"add input"| tr os --&gt; |"add output"| tr in --&gt; |"read"| tr --&gt; |"write"| out]]></summary></entry><entry><title type="html">How to configure output socket for MP3 encoding in C++</title><link href="https://blog.avblocks.com/how-to-configure-output-socket-mp3-encoding-cpp/" rel="alternate" type="text/html" title="How to configure output socket for MP3 encoding in C++" /><published>2024-05-06T00:00:00-07:00</published><updated>2024-05-06T00:00:00-07:00</updated><id>https://blog.avblocks.com/how-to-configure-output-socket-mp3-encoding-cpp</id><content type="html" xml:base="https://blog.avblocks.com/how-to-configure-output-socket-mp3-encoding-cpp/"><![CDATA[<p>Here is a quick snippet for configuring the output socket of a <a href="https://doc.avblocks.com/cpp/latest/classprimo_1_1avblocks_1_1_transcoder.html">Transcoder</a> for MP3 encoding using C++.</p>

<h2 id="diagram">Diagram</h2>

<pre><code class="language-mermaid">flowchart TB
    is("&lt;b&gt;MediaSocket&lt;/b&gt;\nFile: input.wav")
    os("&lt;b&gt;MediaSocket&lt;/b&gt;\nType: MPEG_Audio\nSubtype: MPEG_Audio_Layer3\nFile: output.mp3")
    tr("&lt;b&gt;Transcoder Block&lt;/b&gt;\nopen\nrun\nclose")

    in["input.wav"]
    out["output.mp3"]

    is --&gt; |"add input"| tr 
    os --&gt; |"add output"| tr
    
    in  --&gt; |"read"| tr --&gt; |"write"| out
</code></pre>

<h2 id="code">Code</h2>

<p>This is the code for the output socket:</p>

<pre><code class="language-cpp">primo::ref&lt;MediaSocket&gt; createOutputSocket(Options&amp; opt)
{
    // create stream info to describe the output audio stream
    auto asi = primo::make_ref(Library::createAudioStreamInfo());
    asi-&gt;setStreamType(StreamType::MPEG_Audio);
    asi-&gt;setStreamSubType(StreamSubType::MPEG_Audio_Layer3);

    // The default bitrate is 128000. You can set it to 192000, 256000, etc.
    // asi-&gt;setBitrate(192000);

    // Optionally set the sampling rate and the number of the channels, e.g. 44.1 Khz, Mono 
    // asi-&gt;setSampleRate(44100);
    // asi-&gt;setChannels(1);

    // create a pin using the stream info 
    auto pin = primo::make_ref(Library::createMediaPin());
    pin-&gt;setStreamInfo(asi.get());

    // the pin allows you to specify additional parameters for the encoder 
    // for example, change the stereo mode, e.g. Joint Stereo
    // pin-&gt;params()-&gt;addInt(Param::Encoder::Audio::MPEG1::StereoMode, StereoMode::Joint);

    // finally create a socket for the output container format which is MP3 in this case
    auto socket = primo::make_ref(Library::createMediaSocket());
    socket-&gt;setStreamType(StreamType::MPEG_Audio);
    socket-&gt;setStreamSubType(StreamSubType::MPEG_Audio_Layer3);

    socket-&gt;pins()-&gt;add(pin.get());

    // output to a file
    auto output_file = primo::ustring(opt.outputFile);
    socket-&gt;setFile(output_file);

    return socket;
}
</code></pre>

<p>The complete program is available on <a href="https://github.com/avblocks/avblocks-cpp">GitHub</a>:</p>

<ul>
  <li><a href="https://github.com/avblocks/avblocks-cpp/blob/main/samples/darwin/enc_mp3_file">enc_mp3_file (macOS)</a></li>
  <li><a href="https://github.com/avblocks/avblocks-cpp/blob/main/samples/linux/enc_mp3_file">enc_mp3_file (Linux)</a></li>
  <li><a href="https://github.com/avblocks/avblocks-cpp/blob/main/samples/windows/enc_mp3_file">enc_mp3_file (Windows)</a></li>
</ul>]]></content><author><name>Primo Software</name></author><category term="tips-and-tricks" /><category term="audio" /><category term="encoder" /><category term="mp3" /><category term="c++" /><summary type="html"><![CDATA[Here is a quick snippet for configuring the output socket of a Transcoder for MP3 encoding using C++. Diagram flowchart TB is("&lt;b&gt;MediaSocket&lt;/b&gt;\nFile: input.wav") os("&lt;b&gt;MediaSocket&lt;/b&gt;\nType: MPEG_Audio\nSubtype: MPEG_Audio_Layer3\nFile: output.mp3") tr("&lt;b&gt;Transcoder Block&lt;/b&gt;\nopen\nrun\nclose") in["input.wav"] out["output.mp3"] is --&gt; |"add input"| tr os --&gt; |"add output"| tr in --&gt; |"read"| tr --&gt; |"write"| out]]></summary></entry><entry><title type="html">AVBlocks v3 - What’s New</title><link href="https://blog.avblocks.com/avblocks-3-whats-new/" rel="alternate" type="text/html" title="AVBlocks v3 - What’s New" /><published>2023-07-05T00:00:00-07:00</published><updated>2023-07-05T00:00:00-07:00</updated><id>https://blog.avblocks.com/avblocks-3-whats-new</id><content type="html" xml:base="https://blog.avblocks.com/avblocks-3-whats-new/"><![CDATA[<h3 id="api">API</h3>

<ul>
  <li>Remove 32-bit application support (C++ and .NET)</li>
  <li>C++: Refactor API headers to use lowercase file names and subdirectories for namespaces</li>
  <li>.NET: New AVBlocks .NET SDK for macOS and Linux (based on .NET Core 6+)</li>
  <li>Distribute the <a href="https://github.com/avblocks/avblocks-core">AVBlocks Core</a> and <a href="https://github.com/avblocks/avblocks-net-core">AVBlocks .NET Core</a> through GitHub</li>
</ul>

<h3 id="samples">Samples</h3>

<ul>
  <li>Use cmake and Visual Studio Code for AVBlocks samples</li>
  <li>GitHub repositories for AVBlocks samples</li>
  <li>C++: Add <a href="https://github.com/avblocks/avblocks-cpp/tree/main/samples/windows/enc_preset_file">enc_preset_file</a> sample</li>
  <li>.NET: Add <a href="https://github.com/avblocks/avblocks-net/tree/main/samples/enc_preset_file">enc_preset_file</a> sample</li>
</ul>

<h3 id="docs">Docs</h3>

<ul>
  <li>Split the wiki to separate <a href="https://wiki.avblocks.com/">C++</a> and <a href="https://wiki-net.avblocks.com/">.NET</a> sites</li>
</ul>]]></content><author><name>Primo Software</name></author><category term="news" /><summary type="html"><![CDATA[API Remove 32-bit application support (C++ and .NET) C++: Refactor API headers to use lowercase file names and subdirectories for namespaces .NET: New AVBlocks .NET SDK for macOS and Linux (based on .NET Core 6+) Distribute the AVBlocks Core and AVBlocks .NET Core through GitHub]]></summary></entry><entry><title type="html">AVBlocks v2 - What’s New</title><link href="https://blog.avblocks.com/avblocks-2-whats-new/" rel="alternate" type="text/html" title="AVBlocks v2 - What’s New" /><published>2016-04-16T00:00:00-07:00</published><updated>2016-04-16T00:00:00-07:00</updated><id>https://blog.avblocks.com/avblocks-2-whats-new</id><content type="html" xml:base="https://blog.avblocks.com/avblocks-2-whats-new/"><![CDATA[<h3 id="api">API</h3>

<ul>
  <li>The MediaInfo object now implements the Block abstract interface.</li>
</ul>

<h3 id="samples">Samples</h3>

<ul>
  <li>New <code>overlay_mp4_png_file</code> sample. This sample shows how to place a watermark on a video file by blending a video file with a PNG image.</li>
</ul>]]></content><author><name>Primo Software</name></author><category term="news" /><summary type="html"><![CDATA[API The MediaInfo object now implements the Block abstract interface. Samples New overlay_mp4_png_file sample. This sample shows how to place a watermark on a video file by blending a video file with a PNG image.]]></summary></entry><entry><title type="html">Controling H.264 decoding latency</title><link href="https://blog.avblocks.com/controling-h-264-decoding-latency/" rel="alternate" type="text/html" title="Controling H.264 decoding latency" /><published>2013-12-17T00:00:00-08:00</published><updated>2013-12-17T00:00:00-08:00</updated><id>https://blog.avblocks.com/controling-h-264-decoding-latency</id><content type="html" xml:base="https://blog.avblocks.com/controling-h-264-decoding-latency/"><![CDATA[<p>There is a new parameter in AVBlocks 1.8 called <a href="http://doc.avblocks.com/cpp/latest/namespaceprimo_1_1avblocks_1_1_param_1_1_decoder_1_1_video_1_1_h264_1_1_v_u_i.html#details">MaxDecFrameBuffering</a> (corresponding to <code>max_dec_frame_buffering</code> from the AVC / H.264 standard).
It controls the decoded picture buffer size of the decoder and indirectly affects the decoding latency.<!--more--></p>

<p>Here are some key notes about using this parameter:</p>

<ul>
  <li>It must be set to the output pin (see the sample code below)</li>
  <li>The supported values are 0 and 1. A negative value is ignored.</li>
  <li>MaxDecFrameBuffering(0) achieves decoding latency of 0 frames for progressive streams and 1 frame for interlaced streams.</li>
  <li>MaxDecFrameBuffering(1) achieves decoding latency of 1 frame both for progressive and interlaced streams.</li>
  <li>If the stream has B-frames (or more precisely the total number of reference frames is greater than 1) the decoding will still succeed, but decoding latency will be greater than the required one, as a safety guard.</li>
  <li>With MaxDecFrameBuffering (0|1) only one decoding thread is used, so it hurts performance and it must be used only when low decoding latency is the primary goal.</li>
</ul>

<p>The following code can be used to set the <code>MaxDecFrameBuffering</code> parameter to an output pin:</p>

<pre><code class="language-cpp">void setH264DecodingLatency(primo::avblocks::MediaPin* pin, int32_t desiredLatency)
{
    using namespace primo::avblocks;
    using namespace primo::avblocks::Param;
    
    ParameterList* params ( Library::createParameterList() );
        IntParameter* maxDecFrameBuffering (Library::createIntParameter() );
            maxDecFrameBuffering-&gt;setName(Decoder::Video::H264::VUI::MaxDecFrameBuffering);
            maxDecFrameBuffering-&gt;setValue(desiredLatency);
            params-&gt;add(maxDecFrameBuffering);
        maxDecFrameBuffering-&gt;release();
        pin-&gt;setParams(params);
    params-&gt;release();
}
</code></pre>]]></content><author><name>Primo Software</name></author><category term="tips-and-tricks" /><category term="video" /><category term="decoder" /><category term="h.264" /><category term="avc" /><summary type="html"><![CDATA[There is a new parameter in AVBlocks 1.8 called MaxDecFrameBuffering (corresponding to max_dec_frame_buffering from the AVC / H.264 standard). It controls the decoded picture buffer size of the decoder and indirectly affects the decoding latency.]]></summary></entry><entry><title type="html">AVBlocks will not load if Wmvcore.dll is not present on user’s system</title><link href="https://blog.avblocks.com/avblocks-will-not-load-if-wmvcore-dll-is-not-present-on-users-system/" rel="alternate" type="text/html" title="AVBlocks will not load if Wmvcore.dll is not present on user’s system" /><published>2013-09-09T00:00:00-07:00</published><updated>2013-09-09T00:00:00-07:00</updated><id>https://blog.avblocks.com/avblocks-will-not-load-if-wmvcore-dll-is-not-present-on-users-system</id><content type="html" xml:base="https://blog.avblocks.com/avblocks-will-not-load-if-wmvcore-dll-is-not-present-on-users-system/"><![CDATA[<blockquote>
  <p>Update: This issue has been fixed as of version 1.6.</p>
</blockquote>

<p>Wmvcore.dll is standard on all editions of Windows Vista and Windows 7 with the exception of the “N” editions. The “N” editions are distributed in Europe and do not include Windows Media Player and its related technologies.</p>

<p>The following versions of Windows Vista or Window 7 are affected:</p>

<ul>
  <li>Windows 7 Starter N</li>
  <li>Windows 7 Home Premium N</li>
  <li>Windows 7 Professional N</li>
  <li>Windows 7 Ultimate N</li>
  <li>Windows Vista Home Basic N</li>
  <li>Windows Vista Business N</li>
  <li>Windows Vista Home Basic KN</li>
  <li>Windows Vista Business KN</li>
</ul>

<p>AVBlocks depends on the following Wmvcore.dll functions for ASF muxing and demuxing:</p>

<ul>
  <li>WMCreateProfileManager</li>
  <li>WMCreateSyncReader</li>
  <li>WMCreateWriter</li>
</ul>

<p>We are fixing this issue by changing the code to load Wmvcore.dll on-demand. This fix will be available in AVBlocks 1.6.</p>]]></content><author><name>Primo Software</name></author><category term="tips-and-tricks" /><category term="windows" /><category term="video" /><category term="wmv" /><summary type="html"><![CDATA[Update: This issue has been fixed as of version 1.6. Wmvcore.dll is standard on all editions of Windows Vista and Windows 7 with the exception of the “N” editions. The “N” editions are distributed in Europe and do not include Windows Media Player and its related technologies.]]></summary></entry><entry><title type="html">How to set license string in AVBlocks</title><link href="https://blog.avblocks.com/how-to-set-license-string-in-avblocks/" rel="alternate" type="text/html" title="How to set license string in AVBlocks" /><published>2013-05-29T00:00:00-07:00</published><updated>2013-05-29T00:00:00-07:00</updated><id>https://blog.avblocks.com/how-to-set-license-string-in-avblocks</id><content type="html" xml:base="https://blog.avblocks.com/how-to-set-license-string-in-avblocks/"><![CDATA[<p>This post assumes that you are using AVBlocks for .NET and you have purchased a license from the <a href="https://lm.primosoftware.com" title="License Managerment">License Management</a> site.</p>

<p>When you license a Primo Software product you usually get a license file in the email. The license file is basically a signed XML string that describes the products and features you have licensed. Then you have to provide the license to AVBlocks with the Library.SetLicense method.</p>

<p>Here is a code snippet in C#:</p>

<pre><code class="language-csharp">const string license = 
    @"&lt;primoSoftware&gt;
      &lt;license version='1.0'&gt;
        &lt;token&gt;abcdefghijklmnop&lt;/token&gt;
        &lt;revision&gt;1&lt;/revision&gt;
        &lt;issueDate&gt;2013-05-23&lt;/issueDate&gt;
        &lt;expireDate&gt;2014-05-24&lt;/expireDate&gt;
        &lt;updateTime&gt;2013-05-23 21:02:44&lt;/updateTime&gt;
        &lt;item id='avb-win'&gt;
          &lt;product&gt;avb&lt;/product&gt;
          &lt;feature id='h264-enc' /&gt;
          &lt;feature id='pcm' /&gt;
        &lt;/item&gt;    
    	&lt;signature&gt;abcd-long-signature-string-here&lt;/signature&gt;
      &lt;/license&gt;
    &lt;/primoSoftware&gt;";
    
Library.SetLicense(license);
</code></pre>

<p>The license above is for AVBlocks for Windows (<code>avb-win</code>) and includes the AVC / H.264 Encoder (<code>h264-enc</code>) and PCM Audio (<code>pcm</code>) features.</p>

<p>Then the following calls should return true for the license above:</p>

<pre><code class="language-csharp">Library.IsLicensed(null, null);
Library.IsLicensed(null, "h264-enc");
Library.IsLicensed(null, "pcm");
Library.IsLicensed("avb", "h264-enc");
Library.IsLicensed("avb", "pcm");
</code></pre>

<p>NOTES:</p>

<ol>
  <li>
    <p>Calling <code>Library.SetLicense</code> on any of the AVBlocks Demo libraries will fail. The Demo version cannot be licensed. If you downloaded AVBlocks from <a href="https://avblocks.com/download/" title="www.avblocks.com">www.avblocks.com</a> then you have the Demo product. You need to get your AVBlocks copy from the Downloads section of the <a href="https://lm.primosoftware.com">License Manager</a> site.</p>
  </li>
  <li>
    <p>You should be careful when formatting the license XML as it may become invalid.</p>
  </li>
</ol>

<p>Here are the rules:</p>

<ul>
  <li>It’s OK to reformat the blank space between the xml elements in the license (spaces, new lines) the way you wish.</li>
  <li>It’s also OK to substitute the double quotes with single quotes (as shown in the example above), otherwise you need to escape the double quotes.</li>
  <li>It’s NOT OK to reorder elements or change the letter case.</li>
</ul>]]></content><author><name>Primo Software</name></author><category term="tips-and-tricks" /><category term="license" /><summary type="html"><![CDATA[This post assumes that you are using AVBlocks for .NET and you have purchased a license from the License Management site. When you license a Primo Software product you usually get a license file in the email. The license file is basically a signed XML string that describes the products and features you have licensed. Then you have to provide the license to AVBlocks with the Library.SetLicense method.]]></summary></entry><entry><title type="html">AVBlocks in demo mode</title><link href="https://blog.avblocks.com/avblocks-in-demo-mode/" rel="alternate" type="text/html" title="AVBlocks in demo mode" /><published>2012-10-20T00:00:00-07:00</published><updated>2012-10-20T00:00:00-07:00</updated><id>https://blog.avblocks.com/avblocks-in-demo-mode</id><content type="html" xml:base="https://blog.avblocks.com/avblocks-in-demo-mode/"><![CDATA[<p>The following restrictions apply when AVBlocks works in demo mode:</p>

<ul>
  <li>For video streams, a semi-transparent logo is overlaid on top of each video frame.</li>
  <li>For audio streams, a short audio sample is mixed in the original track at random places.</li>
</ul>

<p>The demo restrictions are removed when a valid XML license is passed to <code>Library::setLicense</code> API method.</p>]]></content><author><name>Primo Software</name></author><category term="demo" /><summary type="html"><![CDATA[The following restrictions apply when AVBlocks works in demo mode: For video streams, a semi-transparent logo is overlaid on top of each video frame. For audio streams, a short audio sample is mixed in the original track at random places. The demo restrictions are removed when a valid XML license is passed to Library::setLicense API method.]]></summary></entry></feed>