mb_buffer.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:2k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.  *  mb_buffer.c
  3.  *
  4.  *  Copyright (C) Aaron Holtzman <aholtzma@ess.engr.uvic.ca> - Nov 1999
  5.  *
  6.  *  Decodes an MPEG-2 video stream.
  7.  *
  8.  *  This file is part of mpeg2dec, a free MPEG-2 video stream decoder.
  9.  *
  10.  *  mpeg2dec is free software; you can redistribute it and/or modify
  11.  *  it under the terms of the GNU General Public License as published by
  12.  *  the Free Software Foundation; either version 2, or (at your option)
  13.  *  any later version.
  14.  *   
  15.  *  mpeg2dec is distributed in the hope that it will be useful,
  16.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  17.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  18.  *  GNU General Public License for more details.
  19.  *   
  20.  *  You should have received a copy of the GNU General Public License
  21.  *  along with GNU Make; see the file COPYING.  If not, write to
  22.  *  the Free Software Foundation, 
  23.  *
  24.  */
  25. #include <stdlib.h>
  26. #include <stdio.h>
  27. #include "mpeg2.h"
  28. #include "mpeg2_internal.h"
  29. #include "mb_buffer.h"
  30. //FIXME dynamically set this
  31. #define MACROBLOCK_BUFFER_SIZE 100
  32. macroblock_t *macroblocks;
  33. uint_32 num_blocks = 0;
  34. macroblock_t*
  35. mb_buffer_init(uint_32 chroma_format)
  36. {
  37. uint_32 i;
  38. num_blocks = 0;
  39. macroblocks = malloc(MACROBLOCK_BUFFER_SIZE * sizeof(macroblock_t));
  40. if(!macroblocks)
  41. return 0;
  42. macroblocks[0].y_blocks  = malloc(sizeof(sint_16) *  64 * 4 * MACROBLOCK_BUFFER_SIZE);
  43. macroblocks[0].cr_blocks = malloc(sizeof(sint_16) *  64 * MACROBLOCK_BUFFER_SIZE);
  44. macroblocks[0].cb_blocks = malloc(sizeof(sint_16) *  64 * MACROBLOCK_BUFFER_SIZE);
  45. if((!macroblocks[0].y_blocks) || (!macroblocks[0].cr_blocks) || (!macroblocks[0].cr_blocks))
  46. return 0;
  47. for(i=1;i < MACROBLOCK_BUFFER_SIZE;i++)
  48. {
  49. macroblocks[i].y_blocks  = macroblocks[i - 1].y_blocks  + 64 * 4;
  50. macroblocks[i].cr_blocks = macroblocks[i - 1].cr_blocks + 64;
  51. macroblocks[i].cb_blocks = macroblocks[i - 1].cb_blocks + 64;
  52. }
  53. return macroblocks;
  54. }
  55. macroblock_t*
  56. mb_buffer_increment()
  57. {
  58. num_blocks++;
  59. if (num_blocks == MACROBLOCK_BUFFER_SIZE)
  60. return 0;
  61. return &macroblocks[num_blocks];
  62. }
  63. void
  64. mb_buffer_flush(mb_buffer_t *mb_buffer)
  65. {
  66. mb_buffer->macroblocks = macroblocks;
  67. mb_buffer->num_blocks = num_blocks;
  68. num_blocks = 0;
  69. }