aboutsummaryrefslogtreecommitdiff
path: root/Src/vp6/flv_vp6_decoder.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/vp6/flv_vp6_decoder.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/vp6/flv_vp6_decoder.cpp')
-rw-r--r--Src/vp6/flv_vp6_decoder.cpp141
1 files changed, 141 insertions, 0 deletions
diff --git a/Src/vp6/flv_vp6_decoder.cpp b/Src/vp6/flv_vp6_decoder.cpp
new file mode 100644
index 00000000..5de9fd76
--- /dev/null
+++ b/Src/vp6/flv_vp6_decoder.cpp
@@ -0,0 +1,141 @@
+#include "flv_vp6_decoder.h"
+#include "../nsv/nsvlib.h"
+#include "../libvp6/include/vp6.h"
+int FLVDecoderCreator::CreateVideoDecoder(int format_type, int width, int height, ifc_flvvideodecoder **decoder)
+{
+ if (format_type == FLV::VIDEO_FORMAT_VP6 || format_type == FLV::VIDEO_FORMAT_VP62)
+ {
+ //DXL_XIMAGE_HANDLE xim = DXL_CreateXImageOfType((unsigned char *)"" , format_type == FLV::VIDEO_FORMAT_VP6?NSV_MAKETYPE('V','P','6','0'):NSV_MAKETYPE('V','P','6','2'));
+ DXL_XIMAGE_HANDLE xim = DXL_AlterXImage( NULL, (unsigned char *)"" ,NSV_MAKETYPE('V','P','6','0'), DXRGBNULL, 0, 0);
+ if (!xim)
+ return CREATEDECODER_FAILURE;
+ *decoder = new FLVVP6(xim);
+ return CREATEDECODER_SUCCESS;
+ }
+ return CREATEDECODER_NOT_MINE;
+}
+
+int FLVDecoderCreator::HandlesVideo(int format_type)
+{
+ if (format_type == FLV::VIDEO_FORMAT_VP6 || format_type == FLV::VIDEO_FORMAT_VP62)
+ {
+ return CREATEDECODER_SUCCESS;
+ }
+ return CREATEDECODER_NOT_MINE;
+}
+
+#define CBCLASS FLVDecoderCreator
+START_DISPATCH;
+CB(CREATE_VIDEO_DECODER, CreateVideoDecoder)
+CB(HANDLES_VIDEO, HandlesVideo)
+END_DISPATCH;
+#undef CBCLASS
+
+static const int vp6_postProcess=6;
+static const int vp6_cpuFree=70;
+static const int vp6_deInterlace=0;
+static const int vp6_addNoise=1;
+
+ enum
+{
+ PBC_SET_POSTPROC,
+ PBC_SET_CPUFREE,
+ PBC_MAX_PARAM,
+ PBC_SET_TESTMODE,
+ PBC_SET_PBSTRUCT,
+ PBC_SET_BLACKCLAMP,
+ PBC_SET_WHITECLAMP,
+ PBC_SET_REFERENCEFRAME,
+ PBC_SET_DEINTERLACEMODE,
+ PBC_SET_ADDNOISE
+
+} ;
+
+ extern "C"
+ {
+ void GetImageBufs(DXL_XIMAGE_HANDLE x, YV12_PLANES *p);
+ void vp60_SetParameter(DXL_XIMAGE_HANDLE src, int Command, uintptr_t Parameter );
+};
+
+FLVVP6::FLVVP6(DXL_XIMAGE_HANDLE xim) : xim(xim)
+{
+ decoded=0;
+
+ if(vp6_cpuFree)
+ vp60_SetParameter(xim, PBC_SET_CPUFREE, vp6_cpuFree);
+ else
+ vp60_SetParameter(xim, PBC_SET_POSTPROC, vp6_postProcess);
+
+ vp60_SetParameter(xim, PBC_SET_DEINTERLACEMODE, vp6_deInterlace );
+ vp60_SetParameter(xim, PBC_SET_ADDNOISE, vp6_addNoise);
+ vp60_SetParameter(xim, PBC_SET_BLACKCLAMP,0);
+ vp60_SetParameter(xim, PBC_SET_WHITECLAMP,0);
+}
+
+int FLVVP6::GetOutputFormat(int *x, int *y, int *color_format)
+{
+ if (xim)
+ {
+ if (vp60_getWH(xim, x, y) == DXL_OK)
+ {
+ *color_format = NSV_MAKETYPE('Y','V','1','2');
+ return FLV_VIDEO_SUCCESS;
+ }
+ }
+ return FLV_VIDEO_FAILURE;
+}
+
+int FLVVP6::DecodeSample(const void *inputBuffer, size_t inputBufferBytes, int32_t timestamp)
+{
+ uint8_t *vp6_data = (uint8_t *)inputBuffer;
+ if (inputBufferBytes)
+ {
+ // skip first byte
+ vp6_data++;
+ inputBufferBytes--;
+
+ DXL_AlterXImageData(xim, (unsigned char *)vp6_data);
+ DXL_SetXImageCSize(xim, inputBufferBytes);
+ if (!vp60_decompress(xim))
+ {
+ decoded=1;
+ return FLV_VIDEO_SUCCESS;
+ }
+ }
+
+ return FLV_VIDEO_FAILURE;
+
+}
+
+void FLVVP6::Close()
+{
+ if (xim)
+ DXL_DestroyXImage(xim);
+
+ delete this;
+}
+
+int FLVVP6::GetPicture(void **data, void **decoder_data, uint64_t *timestamp)
+{
+ if (decoded)
+ {
+ GetImageBufs(xim,&vidbufdec);
+ *data=&vidbufdec;
+ *decoder_data = 0;
+ decoded = 0;
+ return FLV_VIDEO_SUCCESS;
+ }
+
+ return FLV_VIDEO_FAILURE;
+}
+
+
+#define CBCLASS FLVVP6
+START_DISPATCH;
+CB(FLV_VIDEO_GETOUTPUTFORMAT, GetOutputFormat)
+CB(FLV_VIDEO_DECODE, DecodeSample)
+VCB(FLV_VIDEO_CLOSE, Close)
+CB(FLV_VIDEO_GET_PICTURE, GetPicture)
+END_DISPATCH;
+#undef CBCLASS
+