dirac_parser.cpp
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:8k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /* ***** BEGIN LICENSE BLOCK *****
  2. *
  3. * $Id: dirac_parser.cpp,v 1.4 2005/01/30 05:11:41 gabest Exp $ $Name:  $
  4. *
  5. * Version: MPL 1.1/GPL 2.0/LGPL 2.1
  6. *
  7. * The contents of this file are subject to the Mozilla Public License
  8. * Version 1.1 (the "License"); you may not use this file except in compliance
  9. * with the License. You may obtain a copy of the License at
  10. * http://www.mozilla.org/MPL/
  11. *
  12. * Software distributed under the License is distributed on an "AS IS" basis,
  13. * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  14. * the specific language governing rights and limitations under the License.
  15. *
  16. * The Original Code is BBC Research and Development code.
  17. *
  18. * The Initial Developer of the Original Code is the British Broadcasting
  19. * Corporation.
  20. * Portions created by the Initial Developer are Copyright (C) 2004.
  21. * All Rights Reserved.
  22. *
  23. * Contributor(s): Anuradha Suraparaju (Original Author)
  24. *
  25. * Alternatively, the contents of this file may be used under the terms of
  26. * the GNU General Public License Version 2 (the "GPL"), or the GNU Lesser
  27. * Public License Version 2.1 (the "LGPL"), in which case the provisions of
  28. * the GPL or the LGPL are applicable instead of those above. If you wish to
  29. * allow use of your version of this file only under the terms of the either
  30. * the GPL or LGPL and not to allow others to use your version of this file
  31. * under the MPL, indicate your decision by deleting the provisions above
  32. * and replace them with the notice and other provisions required by the GPL
  33. * or LGPL. If you do not delete the provisions above, a recipient may use
  34. * your version of this file under the terms of any one of the MPL, the GPL
  35. * or the LGPL.
  36. * ***** END LICENSE BLOCK ***** */
  37. #include <cstring>
  38. #include <libdirac_common/dirac_assertions.h>
  39. #include <libdirac_decoder/dirac_cppparser.h>
  40. #include <libdirac_decoder/dirac_parser.h>
  41. #include <libdirac_common/frame.h>
  42. using namespace dirac;
  43. #ifdef __cplusplus
  44. extern "C" {
  45. #endif
  46. extern DllExport dirac_decoder_t *dirac_decoder_init(int verbose)
  47. {
  48.     dirac_decoder_t* decoder = new dirac_decoder_t;
  49.     memset (decoder, 0, sizeof(dirac_decoder_t));
  50.     bool verbosity = verbose > 0 ? true : false;
  51.     DiracParser *parser = new DiracParser(verbosity);
  52.     decoder->parser = static_cast<void *>(parser);
  53.     decoder->fbuf = new dirac_framebuf_t;
  54.     decoder->fbuf->id = NULL;
  55.     decoder->fbuf->buf[0] = decoder->fbuf->buf[1] = decoder->fbuf->buf[2] = NULL;
  56.     return decoder;
  57. }
  58. extern DllExport void dirac_decoder_close(dirac_decoder_t *decoder)
  59. {
  60.     TEST (decoder != NULL);
  61.     TEST (decoder->parser != NULL);
  62.     DiracParser *parser = static_cast<DiracParser *>(decoder->parser);
  63.     delete parser;
  64.     delete decoder->fbuf;
  65.     delete decoder;
  66.     decoder = NULL;
  67. }
  68. extern DllExport void dirac_buffer (dirac_decoder_t *decoder, unsigned char *start, unsigned char *end)
  69. {
  70.     TEST (decoder != NULL);
  71.     TEST (decoder->parser != NULL);
  72.     DiracParser *parser = static_cast<DiracParser *>(decoder->parser);
  73.     parser->SetBuffer((char *)start, (char *)end);
  74. }
  75. static void set_sequence_params (const  DiracParser * const parser, dirac_decoder_t *decoder)
  76. {
  77.     TEST (parser != NULL);
  78.     TEST (decoder != NULL);
  79.     dirac_seqparams_t *seq_params = &decoder->seq_params;
  80.     const SeqParams& sparams = parser->GetSeqParams();
  81.     seq_params->width = sparams.Xl();
  82.     seq_params->height = sparams.Yl();
  83.     ///TODO: how do we sync definition of Chroma in dirac_parser.cpp 
  84.     // with Chroma is common.h
  85.     seq_params->chroma = (dirac_chroma_t)sparams.CFormat();
  86.     switch(seq_params->chroma)
  87.     {
  88.     case format411:
  89.             seq_params->chroma_width = seq_params->width/4;
  90.             seq_params->chroma_height = seq_params->height;
  91.         break;
  92.     case format420:
  93.           seq_params->chroma_width = seq_params->width/2;
  94.             seq_params->chroma_height = seq_params->height/2;
  95.         break;
  96.     case format422:
  97.             seq_params->chroma_width = seq_params->width/2;
  98.             seq_params->chroma_height = seq_params->height;
  99.             break;
  100.     default:
  101.             seq_params->chroma_width = seq_params->width;
  102.             seq_params->chroma_height = seq_params->height;
  103.         break;
  104.    }
  105.     // NOTE: frame rate will be replaced by a struct holding numerator
  106.     //       and denominator values.
  107.     seq_params->frame_rate.numerator = sparams.FrameRate();
  108.     seq_params->frame_rate.denominator = 1;
  109.     seq_params->interlace = sparams.Interlace() ? 1 : 0;
  110.     seq_params->topfieldfirst = sparams.TopFieldFirst() ? 1 : 0;
  111. }
  112. static void set_component (const PicArray& pic_data,  const CompSort cs, dirac_decoder_t *decoder)
  113. {
  114.     TEST (decoder->fbuf != NULL);
  115.     int xl, yl;
  116.     unsigned char *buf;
  117.     switch (cs)
  118.     {
  119.     case U_COMP:
  120.         xl = decoder->seq_params.chroma_width;
  121.         yl = decoder->seq_params.chroma_height;
  122.            buf = decoder->fbuf->buf[1];
  123.         break;
  124.     case V_COMP:
  125.         xl = decoder->seq_params.chroma_width;
  126.         yl = decoder->seq_params.chroma_height;
  127.            buf = decoder->fbuf->buf[2];
  128.         break;
  129.        case Y_COMP:
  130.     default:
  131.         xl = decoder->seq_params.width;
  132.         yl = decoder->seq_params.height;
  133.         buf = decoder->fbuf->buf[0];
  134.         break;
  135.     }
  136.     TEST (buf != NULL);
  137.     ValueType tempv;
  138.     for (int j=0 ; j<yl ;++j)
  139.     {
  140.         for (int i=0 ; i<xl ; ++i)
  141.         {                
  142.             tempv=pic_data[j][i]+2;
  143.             tempv>>=2;
  144.             buf[j*xl+i]=(unsigned char) tempv;                
  145.         }//i
  146.     }//j
  147. }
  148. static void set_frame_data (const  DiracParser * const parser, dirac_decoder_t *decoder)
  149. {
  150.     TEST (parser != NULL);
  151.     TEST (decoder != NULL);
  152.     TEST (decoder->fbuf != NULL);
  153.     TEST (decoder->state == STATE_PICTURE_AVAIL);
  154.     const Frame& my_frame = parser->GetNextFrame();
  155.     set_component (my_frame.Ydata(), Y_COMP, decoder);
  156.     if (decoder->seq_params.chroma != Yonly)
  157.     {
  158.         set_component (my_frame.Udata(), U_COMP, decoder);
  159.         set_component (my_frame.Vdata(), V_COMP, decoder);
  160.     }
  161.     return;
  162. }
  163. static void set_frame_params (const FrameParams& my_frame_params,  dirac_decoder_t *decoder)
  164. {
  165.     TEST (decoder != NULL);
  166.     dirac_frameparams_t *frame_params = &decoder->frame_params;
  167.     TEST (decoder->state == STATE_PICTURE_AVAIL ||
  168.           decoder->state == STATE_PICTURE_START);
  169.     frame_params->ftype = (dirac_frame_type_t)my_frame_params.FSort();
  170.     frame_params->fnum = my_frame_params.FrameNum();
  171.     return;
  172. }
  173. extern DllExport dirac_decoder_state_t dirac_parse (dirac_decoder_t *decoder)
  174. {
  175.     TEST (decoder != NULL);
  176.     TEST (decoder->parser != NULL);
  177.     DiracParser *parser = static_cast<DiracParser *>(decoder->parser);
  178.     decoder->state = parser->Parse();
  179.     switch (decoder->state)
  180.     {
  181.     case STATE_BUFFER:
  182.         break;
  183.     case STATE_SEQUENCE:
  184.         set_sequence_params(parser, decoder);
  185.         decoder->frame_avail = 0;
  186.         break;
  187.     case STATE_PICTURE_START:
  188.         /* frame params of the frame being decoded in coding order */
  189.         set_frame_params (parser->GetNextFrameParams(), decoder);
  190.         decoder->frame_avail = 0;
  191.         break;
  192.     case STATE_PICTURE_AVAIL:
  193.         decoder->frame_avail = 1;
  194.         /* frame params of the frame available for display */
  195.         set_frame_params (parser->GetNextFrame().GetFparams(), decoder);
  196.         set_frame_data (parser, decoder);
  197.         break;
  198.     case STATE_INVALID:
  199.         break;
  200.     default:
  201.         break;
  202.     }
  203.     return decoder->state;
  204. }
  205. extern DllExport void dirac_skip (dirac_decoder_t *decoder, int skip)
  206. {
  207.     TEST (decoder != NULL);
  208.     TEST (decoder->parser != NULL);
  209.     DiracParser *parser = static_cast<DiracParser *>(decoder->parser);
  210.     parser->SetSkip(skip > 0 ? true : false);
  211. }
  212. extern DllExport void dirac_set_buf (dirac_decoder_t *decoder, unsigned char *buf[3], void *id)
  213. {
  214.     TEST (decoder != NULL);
  215.     TEST (decoder->fbuf != NULL);
  216.     decoder->fbuf->buf[0] = buf[0];
  217.     decoder->fbuf->buf[1] = buf[1];
  218.     decoder->fbuf->buf[2] = buf[2];
  219.     decoder->fbuf->id  = id;
  220. }
  221. #ifdef __cplusplus
  222. }
  223. #endif