title: Error when decode AAC with avcodec_decode_audio4()
body: <p>I'm trying to decode AAC with FFmpeg native decoder and encountered an error</p>
  
  <pre><code>SSR is not implemeted. Update your FFmpeg version to newest from Git. If the      problem still occurs, it mean that your file has a feature which has not implemented.
  </code></pre>
  
  <p>Function <em>avcodec_decode_audio4()</em> return -1163346256. Is this because of FFmpeg version? I downloaded shared and dev version from <a href="http://ffmpeg.zeranoe.com/builds/" rel="nofollow noreferrer">here</a>. Is this up to date?</p>
  
  <p>Here is the source code:</p>
  
  <pre><code>#include "stdafx.h"
  #include "stdio.h"
  #include "conio.h"
  
  extern "C" 
  {
  #ifndef __STDC_CONSTANT_MACROS
  #define __STDC_CONSTANT_MACROS
  #endif
  #include &lt;libavcodec\avcodec.h&gt;
  #include &lt;libavformat/avformat.h&gt;
  }
  
  // compatibility with newer API
  #if LIBAVCODEC_VERSION_INT &lt; AV_VERSION_INT(55,28,1)
  #define av_frame_alloc avcodec_alloc_frame
  #define av_frame_free avcodec_free_frame
  #endif
  
  #define AUDIO_INBUF_SIZE 20480
  #define AUDIO_REFILL_THRESH 4096
  
  
  static void audio_decode_example(const char *outfilename, const char *filename);
  
  
  int main(int argc, char *argv[]) {
      audio_decode_example("D:\\sample.pcm","D:\\sample.m4a");
      getch();
      return 0;
  }
  
  
  /*
   * Audio decoding.
   */
  static void audio_decode_example(const char *outfilename, const char *filename)
  {
      AVCodec *codec;
      AVFormatContext   *pFormatCtx = NULL;
      AVCodecContext    *pCodecCtxOrig = NULL;
      AVCodecContext * pCodecCtx= NULL;
      int len;
      FILE *f, *outfile;
      uint8_t inbuf[AUDIO_INBUF_SIZE + FF_INPUT_BUFFER_PADDING_SIZE];
      AVPacket avpkt;
      AVFrame *decoded_frame = NULL;
  
  
      av_register_all();
  
      av_init_packet(&amp;avpkt);
  
      printf("Decode audio file %s to %s\n", filename, outfilename);
  
      // Open file to get format context
      if(avformat_open_input(&amp;pFormatCtx, filename, NULL, NULL)!=0){
          printf("Couldn't open file");
          return; // Couldn't open file
      }
  
      // Retrieve stream information
      if(avformat_find_stream_info(pFormatCtx, NULL)&lt;0){
          printf("Couldn't find stream information");
          return; // Couldn't find stream information
      }
  
      // Dump information about file onto standard error
      av_dump_format(pFormatCtx, 0, filename, 0);
  
      // Find the first audio stream
      int audioStream = -1;
      int i =0;
      for(i=0; i&lt;pFormatCtx-&gt;nb_streams; i++) {
          if(pFormatCtx-&gt;streams[i]-&gt;codec-&gt;codec_type==AVMEDIA_TYPE_AUDIO) {
              audioStream=i;
              break;
          }
      }
  
      if(audioStream==-1) {
          printf("Didn't find a audio stream");
          return; // Didn't find a audio stream
      }
  
      // Get a pointer to the codec context for the audio stream
      pCodecCtxOrig=pFormatCtx-&gt;streams[audioStream]-&gt;codec;
  
      // Find the decoder for the audio stream
      codec=avcodec_find_decoder(pCodecCtxOrig-&gt;codec_id);
      if(codec==NULL) {
          fprintf(stderr, "Codec not found\n");
          return; // Codec not found
      }
  
      pCodecCtx = avcodec_alloc_context3(codec);
      if (!pCodecCtx) {
          fprintf(stderr, "Could not allocate audio codec context\n");
          return;
      }
  
      if(avcodec_copy_context(pCodecCtx, pCodecCtxOrig) != 0) {
          fprintf(stderr, "Couldn't copy codec context");
          return; // Error copying codec context
      }
  
  
      /* open it */
      if (avcodec_open2(pCodecCtx, codec, NULL) &lt; 0) {
          fprintf(stderr, "Could not open codec\n");
          return;
      }
  
      f = fopen(filename, "rb");
      if (!f) {
          fprintf(stderr, "Could not open %s\n", filename);
          return;
      }
      outfile = fopen(outfilename, "wb");
      if (!outfile) {
          av_free(pCodecCtx);
          return;
      }
  
      /* decode until eof */
      avpkt.data = inbuf;
      avpkt.size = fread(inbuf, 1, AUDIO_INBUF_SIZE, f);
  
      while (avpkt.size &gt; 0) {
          int i, ch;
          int got_frame = 0;
  
          if (!decoded_frame) {
              if (!(decoded_frame = av_frame_alloc())) {
                  fprintf(stderr, "Could not allocate audio frame\n");
                  return;
              }
          }
  
          len = avcodec_decode_audio4(pCodecCtx, decoded_frame, &amp;got_frame, &amp;avpkt);
          if (len &lt; 0) {
              fprintf(stderr, "Error while decoding. len = %d \n",len);
              return;
          }
          if (got_frame) {
              /* if a frame has been decoded, output it */
              int data_size = av_get_bytes_per_sample(pCodecCtx-&gt;sample_fmt);
              if (data_size &lt; 0) {
                  /* This should not occur, checking just for paranoia */
                  fprintf(stderr, "Failed to calculate data size\n");
                  return;
              }
              for (i=0; i &lt; decoded_frame-&gt;nb_samples; i++)
                  for (ch=0; ch &lt; pCodecCtx-&gt;channels; ch++)
                      fwrite(decoded_frame-&gt;data[ch] + data_size*i, 1, data_size, outfile);
          }
          avpkt.size -= len;
          avpkt.data += len;
          avpkt.dts =
          avpkt.pts = AV_NOPTS_VALUE;
          if (avpkt.size &lt; AUDIO_REFILL_THRESH) {
              /* Refill the input buffer, to avoid trying to decode
               * incomplete frames. Instead of this, one could also use
               * a parser, or use a proper container format through
               * libavformat. */
              memmove(inbuf, avpkt.data, avpkt.size);
              avpkt.data = inbuf;
              len = fread(avpkt.data + avpkt.size, 1,
                          AUDIO_INBUF_SIZE - avpkt.size, f);
              if (len &gt; 0)
                  avpkt.size += len;
          }
      }
  
      fclose(outfile);
      fclose(f);
  
      avcodec_close(pCodecCtx);
      av_free(pCodecCtx);
      av_frame_free(&amp;decoded_frame);
  }
  </code></pre>
  
  <p>I have also read this question: <a href="https://stackoverflow.com/questions/25033100/how-to-decode-aac-using-avcodec-decode-audio4">How to decode AAC using avcodec_decode_audio4?</a> but no solution is provided.</p>