00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <mxcpcBufferedMxPEGDecoderBackEnd.h>
00021
00022 #include <cstdio>
00023 #include <memory>
00024
00025
00026
00027 mxcpcBufferedMxPEGDecoderBackEnd::mxcpcBufferedMxPEGDecoderBackEnd() {
00028
00029 Width = Height = 0;
00030 TileNumX = TileNumY = 0;
00031
00032 PixelBuffer = 0;
00033 PixelBufferOffset = 0;
00034 }
00035
00036
00037 mxcpcBufferedMxPEGDecoderBackEnd::~mxcpcBufferedMxPEGDecoderBackEnd() {
00038
00039 delete[] PixelBuffer;
00040 }
00041
00042
00043
00044 void mxcpcBufferedMxPEGDecoderBackEnd::videoResolutionChanged(int width,
00045 int height) {
00046
00047 int tile_num_x,
00048 tile_num_y;
00049 char txt[100];
00050 int unused_line_num;
00051
00052 delete[] PixelBuffer;
00053
00054 try {
00055
00056 tile_num_x = width/16;
00057 if(width % 16) tile_num_x++;
00058 tile_num_y = height/16;
00059 if(height % 16) tile_num_y++;
00060
00061 PixelBuffer = new mxcpc::u32[tile_num_x*tile_num_y * 16*16*3/4];
00062 unused_line_num = height % 16;
00063 if(unused_line_num)
00064 PixelBufferOffset = unused_line_num * (tile_num_x * 3 * 16/4);
00065 else
00066 PixelBufferOffset = 0;
00067
00068 Width = width;
00069 Height = height;
00070
00071 TileNumX = tile_num_x;
00072 TileNumY = tile_num_y;
00073
00074 std::sprintf(txt, "mxcpcBufferedMxPEGDecoderBackEnd : "
00075 "switched video resolution to "
00076 "%dx%d",
00077 width, height);
00078 mxcpc::sendStatusMsg(txt);
00079
00080 } catch(std::bad_alloc) {
00081
00082 PixelBuffer = 0;
00083 PixelBufferOffset = 0;
00084 Width = Height = 0;
00085 TileNumX = TileNumY = 0;
00086
00087 std::sprintf(txt, "mxcpcBufferedMxPEGDecoderBackEnd : "
00088 "!!! failed to switch video reolution to "
00089 "%dx%d !!!",
00090 width, height);
00091 mxcpc::sendStatusMsg(txt);
00092
00093 errorEncountered();
00094 }
00095 }
00096
00097
00098 void mxcpcBufferedMxPEGDecoderBackEnd
00099 ::provideVideoTilePixelTarget(int tile_x, int tile_y,
00100 mxcpc::u32 **target_ptr,
00101 int *row_stepping_ptr) {
00102
00103 int rowsize;
00104
00105 if(!PixelBuffer) {
00106
00107 *target_ptr = DummyTilePixelBuffer;
00108 *row_stepping_ptr = 0;
00109 }
00110 else {
00111
00112 rowsize = 16*3/4;
00113
00114 *target_ptr = PixelBuffer
00115 + (((TileNumY - 1 - tile_y)*16 + 15)*TileNumX + tile_x) * rowsize;
00116 *row_stepping_ptr = -(1 + TileNumX) * rowsize;
00117 }
00118 }
00119