aboutsummaryrefslogtreecommitdiff
path: root/Src/bmp/avi_yuv_decoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Src/bmp/avi_yuv_decoder.cpp')
-rw-r--r--Src/bmp/avi_yuv_decoder.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/Src/bmp/avi_yuv_decoder.cpp b/Src/bmp/avi_yuv_decoder.cpp
new file mode 100644
index 00000000..441790d2
--- /dev/null
+++ b/Src/bmp/avi_yuv_decoder.cpp
@@ -0,0 +1,117 @@
+#include "avi_yuv_decoder.h"
+#include "../Winamp/wa_ipc.h"
+#include <limits.h>
+#include <bfc/error.h>
+#include <intsafe.h>
+
+int BMP_GetMallocSize(int32_t height, int32_t width, int32_t bits_per_pixel, size_t *out_frame_bytes);
+
+AVIYUV *AVIYUV::CreateDecoder(nsavi::video_format *stream_format)
+{
+ AVIYUV *decoder = new AVIYUV( stream_format);
+ if (!decoder)
+ {
+ return 0;
+ }
+
+ if (decoder->Initialize() != NErr_Success)
+ {
+ delete decoder;
+ return 0;
+ }
+ return decoder;
+}
+
+
+AVIYUV::AVIYUV(nsavi::video_format *stream_format) : stream_format(stream_format)
+{
+ video_frame=0;
+ video_frame_size_bytes=0;
+ o=false;
+}
+
+AVIYUV::~AVIYUV()
+{
+ free(video_frame);
+}
+
+
+int AVIYUV::Initialize()
+{
+ size_t frame_bytes;
+ int ret = BMP_GetMallocSize(stream_format->height, stream_format->width, 16, &frame_bytes);
+ if (ret != NErr_Success)
+ return ret;
+
+ video_frame=malloc(frame_bytes);
+ if (!video_frame)
+ return NErr_OutOfMemory;
+
+ video_frame_size_bytes = frame_bytes;
+ return NErr_Success;
+}
+
+int AVIYUV::GetOutputProperties(int *x, int *y, int *color_format, double *aspect_ratio, int *flip)
+{
+ if (stream_format)
+ {
+ *x = stream_format->width;
+ *y = stream_format->height;
+ //*flip = 1;
+ *color_format = stream_format->compression;
+ return AVI_SUCCESS;
+ }
+
+ return AVI_FAILURE;
+}
+
+int AVIYUV::DecodeChunk(uint16_t type, const void *inputBuffer, size_t inputBufferBytes)
+{
+ if (stream_format)
+ {
+ if (video_frame_size_bytes < inputBufferBytes)
+ return AVI_FAILURE;
+ memcpy(video_frame, inputBuffer, inputBufferBytes);
+ //video_frame = inputBuffer; // heh
+ o=true;
+ return AVI_SUCCESS;
+ }
+
+ return AVI_FAILURE;
+}
+
+void AVIYUV::Flush()
+{
+
+}
+
+int AVIYUV::GetPicture(void **data, void **decoder_data)
+{
+ if (o && video_frame)
+ {
+ *data =(void *) video_frame;
+ *decoder_data=0;
+ //video_frame=0;
+ o=false;
+ //video_outputted=true;
+ return AVI_SUCCESS;
+ }
+
+ return AVI_FAILURE;
+}
+
+void AVIYUV::Close()
+{
+ delete this;
+}
+
+
+#define CBCLASS AVIYUV
+START_DISPATCH;
+CB(GET_OUTPUT_PROPERTIES, GetOutputProperties)
+CB(DECODE_CHUNK, DecodeChunk)
+VCB(FLUSH, Flush)
+VCB(CLOSE, Close)
+CB(GET_PICTURE, GetPicture)
+END_DISPATCH;
+#undef CBCLASS