Initial community commit

This commit is contained in:
Jef 2024-09-24 14:54:57 +02:00
parent 537bcbc862
commit fc06254474
16440 changed files with 4239995 additions and 2 deletions

121
Src/jpeg/amg.cpp Normal file
View file

@ -0,0 +1,121 @@
#include "amg.h"
#include "api__jpeg.h"
#include <setjmp.h>
extern "C"
{
#undef FAR
#include "jpeglib.h"
// our reader...
static void init_source( j_decompress_ptr cinfo )
{}
static const JOCTET jpeg_eof[] = { (JOCTET)0xFF, (JOCTET)JPEG_EOI };
static boolean fill_input_buffer( j_decompress_ptr cinfo )
{
cinfo->src->next_input_byte = jpeg_eof;
cinfo->src->bytes_in_buffer = 2;
return TRUE;
}
static void skip_input_data( j_decompress_ptr cinfo, long num_bytes )
{
//my_src_ptr src = (my_src_ptr) cinfo->src;
if ( num_bytes > 0 )
{
if ( num_bytes > (long)cinfo->src->bytes_in_buffer )
{
fill_input_buffer( cinfo );
}
else
{
cinfo->src->next_input_byte += (size_t)num_bytes;
cinfo->src->bytes_in_buffer -= (size_t)num_bytes;
}
}
}
static void term_source( j_decompress_ptr cinfo )
{}
typedef struct
{
jpeg_destination_mgr pub;
uint8_t *buf;
int len;
} my_destination_mgr;
void init_destination( j_compress_ptr cinfo );
boolean empty_output_buffer( j_compress_ptr cinfo );
void term_destination( j_compress_ptr cinfo );
static void wasabi_jpgload_error_exit( j_common_ptr cinfo )
{
jmp_buf *stack_env = (jmp_buf *)cinfo->client_data;
longjmp( *stack_env, 1 );
}
};
int AMGSucks::WriteAlbumArt(const void *data, size_t data_len, void **out, int *out_len)
{
*out = 0;
jmp_buf stack_env;
jpeg_decompress_struct cinfo_dec={0};
jpeg_compress_struct cinfo={0};
cinfo.client_data=&stack_env;
cinfo_dec.client_data=&stack_env;
if (setjmp(stack_env))
{
// longjmp will goto here
jpeg_destroy_decompress(&cinfo_dec);
jpeg_destroy_compress(&cinfo);
return 1;
}
jpeg_error_mgr jerr;
jpeg_source_mgr src = {(const JOCTET *)data,data_len,init_source,fill_input_buffer,skip_input_data,jpeg_resync_to_restart,term_source};
cinfo_dec.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo_dec);
cinfo_dec.err->error_exit = wasabi_jpgload_error_exit;
cinfo_dec.src = &src;
if (jpeg_read_header(&cinfo_dec, TRUE) == JPEG_HEADER_OK)
{
cinfo.err = cinfo_dec.err;
jpeg_create_compress(&cinfo);
cinfo.err->error_exit = wasabi_jpgload_error_exit;
my_destination_mgr dest = {{0,65536,init_destination,empty_output_buffer,term_destination},0,65536};
dest.buf = (uint8_t *)WASABI_API_MEMMGR->sysMalloc(65536);
dest.pub.next_output_byte = dest.buf;
cinfo.dest = (jpeg_destination_mgr*)&dest;
cinfo.image_width = cinfo_dec.image_width;
cinfo.image_height = cinfo_dec.image_height;
cinfo.input_components = 4;
cinfo.in_color_space = JCS_RGB;
jpeg_copy_critical_parameters(&cinfo_dec, &cinfo);
jvirt_barray_ptr *stuff = jpeg_read_coefficients(&cinfo_dec);
jpeg_write_coefficients(&cinfo, stuff);
const char *blah = "AMG/AOL";
jpeg_write_marker(&cinfo, JPEG_COM, (JOCTET *)blah, (unsigned int)strlen(blah));
jpeg_finish_compress(&cinfo);
*out = dest.buf;
*out_len = dest.len - (int)dest.pub.free_in_buffer;
jpeg_destroy_decompress(&cinfo_dec);
jpeg_destroy_compress(&cinfo);
return 0;
}
return 1;
}
#define CBCLASS AMGSucks
START_DISPATCH;
CB(WRITEALBUMART, WriteAlbumArt);
END_DISPATCH;
#undef CBCLASS

39
Src/jpeg/amg.h Normal file
View file

@ -0,0 +1,39 @@
#pragma once
#include <bfc/dispatch.h>
#include <api/service/services.h>
class api_amgsucks : public Dispatchable
{
protected:
api_amgsucks() {}
~api_amgsucks() {}
public:
int WriteAlbumArt(const void *data, size_t data_len, void **out, int *out_len);
DISPATCH_CODES
{
WRITEALBUMART = 0,
};
};
inline int api_amgsucks::WriteAlbumArt(const void *data, size_t data_len, void **out, int *out_len)
{
return _call(WRITEALBUMART, (int)2, data, data_len, out, out_len);
}
// {E93907C8-8CFD-47dc-87FC-80B5B03716CB}
static const GUID amgSucksGUID =
{ 0xe93907c8, 0x8cfd, 0x47dc, { 0x87, 0xfc, 0x80, 0xb5, 0xb0, 0x37, 0x16, 0xcb } };
class AMGSucks : public api_amgsucks
{
public:
static FOURCC getServiceType() { return WaSvc::UNIQUE; }
static const char *getServiceName() { return "AMG Sucks"; }
static GUID getServiceGuid() { return amgSucksGUID; }
private:
int WriteAlbumArt(const void *data, size_t data_len, void **out, int *out_len);
protected:
RECVS_DISPATCH;
};

12
Src/jpeg/api__jpeg.h Normal file
View file

@ -0,0 +1,12 @@
#ifndef NULLSOFT_APIH
#define NULLSOFT_APIH
#include <api/service/api_service.h>
extern api_service *serviceManager;
#define WASABI_API_SVC serviceManager
#include <api/memmgr/api_memmgr.h>
extern api_memmgr *memoryManager;
#define WASABI_API_MEMMGR memoryManager
#endif

View file

@ -0,0 +1,270 @@
#include "api__jpeg.h"
#include "avi_mjpg_decoder.h"
#include "../Winamp/wa_ipc.h"
#include <limits.h>
#include <intsafe.h>
#include <setjmp.h>
extern "C"
{
#undef FAR
#include "jpeglib.h"
};
uint8_t mjpeg_header[0x1A4] =
{
/* JPEG DHT Segment for YCrCb omitted from MJPG data */
0xFF,0xC4,0x01,0xA2,
0x00,0x00,0x01,0x05,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x01,0x00,0x03,0x01,0x01,0x01,0x01,
0x01,0x01,0x01,0x01,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,
0x08,0x09,0x0A,0x0B,0x10,0x00,0x02,0x01,0x03,0x03,0x02,0x04,0x03,0x05,0x05,0x04,0x04,0x00,
0x00,0x01,0x7D,0x01,0x02,0x03,0x00,0x04,0x11,0x05,0x12,0x21,0x31,0x41,0x06,0x13,0x51,0x61,
0x07,0x22,0x71,0x14,0x32,0x81,0x91,0xA1,0x08,0x23,0x42,0xB1,0xC1,0x15,0x52,0xD1,0xF0,0x24,
0x33,0x62,0x72,0x82,0x09,0x0A,0x16,0x17,0x18,0x19,0x1A,0x25,0x26,0x27,0x28,0x29,0x2A,0x34,
0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x53,0x54,0x55,0x56,
0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x73,0x74,0x75,0x76,0x77,0x78,
0x79,0x7A,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,
0x9A,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,
0xBA,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,
0xDA,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,
0xF8,0xF9,0xFA,0x11,0x00,0x02,0x01,0x02,0x04,0x04,0x03,0x04,0x07,0x05,0x04,0x04,0x00,0x01,
0x02,0x77,0x00,0x01,0x02,0x03,0x11,0x04,0x05,0x21,0x31,0x06,0x12,0x41,0x51,0x07,0x61,0x71,
0x13,0x22,0x32,0x81,0x08,0x14,0x42,0x91,0xA1,0xB1,0xC1,0x09,0x23,0x33,0x52,0xF0,0x15,0x62,
0x72,0xD1,0x0A,0x16,0x24,0x34,0xE1,0x25,0xF1,0x17,0x18,0x19,0x1A,0x26,0x27,0x28,0x29,0x2A,
0x35,0x36,0x37,0x38,0x39,0x3A,0x43,0x44,0x45,0x46,0x47,0x48,0x49,0x4A,0x53,0x54,0x55,0x56,
0x57,0x58,0x59,0x5A,0x63,0x64,0x65,0x66,0x67,0x68,0x69,0x6A,0x73,0x74,0x75,0x76,0x77,0x78,
0x79,0x7A,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x92,0x93,0x94,0x95,0x96,0x97,0x98,
0x99,0x9A,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,
0xB9,0xBA,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,
0xD9,0xDA,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,
0xF9,0xFA
};
int AVIDecoderCreator::CreateVideoDecoder( const nsavi::AVIH *avi_header, const nsavi::STRH *stream_header, const nsavi::STRF *stream_format, const nsavi::STRD *stream_data, ifc_avivideodecoder **decoder )
{
nsavi::video_format *format = (nsavi::video_format *)stream_format;
if ( format )
{
if ( format->compression == 'GPJM' ) // mjpg
{
*decoder = AVIMJPEG::CreateDecoder( format );
if ( *decoder )
return CREATEDECODER_SUCCESS;
else
return CREATEDECODER_FAILURE;
}
}
return CREATEDECODER_NOT_MINE;
}
#define CBCLASS AVIDecoderCreator
START_DISPATCH;
CB( CREATE_VIDEO_DECODER, CreateVideoDecoder )
END_DISPATCH;
#undef CBCLASS
AVIMJPEG *AVIMJPEG::CreateDecoder( nsavi::video_format *stream_format )
{
AVIMJPEG *decoder = new AVIMJPEG( stream_format );
if ( !decoder )
{
return 0;
}
return decoder;
}
AVIMJPEG::AVIMJPEG( nsavi::video_format *stream_format ) : stream_format( stream_format )
{
cinfo.err = jpeg_std_error( &jerr );
jpeg_create_decompress( &cinfo );
jpegLoader = 0;
width = 0;
height = 0;
decoded_image = 0;
image_size = 0;
image_outputted = true;
}
int AVIMJPEG::GetOutputProperties( int *x, int *y, int *color_format, double *aspect_ratio, int *flip )
{
*x = stream_format->width;
*y = stream_format->height;
*color_format = '23GR'; // RGB32
*aspect_ratio = 1.0;
*flip = 0;
return AVI_SUCCESS;
}
struct mjpeg_source_mgr
{
jpeg_source_mgr src;
int state;
const JOCTET *input_buffer;
size_t input_buffer_bytes;
};
static void init_source( j_decompress_ptr cinfo )
{}
static const JOCTET jpeg_eof[] = {(JOCTET) 0xFF, (JOCTET) JPEG_EOI};
static boolean fill_input_buffer( j_decompress_ptr cinfo )
{
mjpeg_source_mgr *msrc = (mjpeg_source_mgr *)cinfo->src;
jpeg_source_mgr *src = &msrc->src;
switch ( msrc->state++ )
{
case 0:
src->next_input_byte = mjpeg_header;
src->bytes_in_buffer = sizeof( mjpeg_header );
return TRUE;
case 1:
src->next_input_byte = msrc->input_buffer + 2;
src->bytes_in_buffer = msrc->input_buffer_bytes - 2;
return TRUE;
case 2:
src->next_input_byte = jpeg_eof;
src->bytes_in_buffer = 2;
return TRUE;
}
return TRUE;
}
void skip_input_data( j_decompress_ptr cinfo, long num_bytes )
{
if ( num_bytes > 0 )
{
if ( num_bytes > (long)cinfo->src->bytes_in_buffer )
{
fill_input_buffer( cinfo );
}
else
{
cinfo->src->next_input_byte += (size_t)num_bytes;
cinfo->src->bytes_in_buffer -= (size_t)num_bytes;
}
}
}
void term_source( j_decompress_ptr cinfo )
{}
static void wasabi_jpgload_error_exit( j_common_ptr cinfo )
{
jmp_buf *stack_env = (jmp_buf *)cinfo->client_data;
longjmp( *stack_env, 1 );
}
int AVIMJPEG::DecodeChunk( uint16_t type, const void *inputBuffer, size_t inputBufferBytes )
{
mjpeg_source_mgr src = { {(const JOCTET *)inputBuffer,2,init_source,fill_input_buffer,skip_input_data,jpeg_resync_to_restart,term_source}, 0, (const JOCTET *)inputBuffer, inputBufferBytes };
cinfo.src = &src.src;
/* set up error handling. basically C style exceptions :) */
jmp_buf stack_env;
cinfo.client_data = &stack_env;
cinfo.err->error_exit = wasabi_jpgload_error_exit;
if ( setjmp( stack_env ) )
{
// longjmp will goto here
jpeg_destroy_decompress( &cinfo );
return AVI_FAILURE;
}
if ( jpeg_read_header( &cinfo, TRUE ) == JPEG_HEADER_OK )
{
cinfo.out_color_space = JCS_RGB;
jpeg_start_decompress( &cinfo );
int this_image_size = cinfo.output_width * cinfo.output_height * 4;
if ( this_image_size > image_size )
{
image_size = this_image_size;
decoded_image = malloc( image_size );
}
ARGB32 *p = (ARGB32 *)decoded_image;// + (cinfo.output_width * cinfo.output_height);
while ( cinfo.output_scanline < cinfo.output_height )
{
//p -= cinfo.output_width;
jpeg_read_scanlines( &cinfo, (JSAMPARRAY)&p, 1 );
// this is pretty homo, but it has to be done
for ( unsigned int i = 0; i < cinfo.output_width; i++ )
// full alpha shift red to correct place leave green alone shift blue to correct place
p[ i ] = ( 0xff000000 | ( ( p[ i ] & 0x0000ff ) << 16 ) | ( p[ i ] & 0x00ff00 ) | ( ( p[ i ] & 0xff0000 ) >> 16 ) );
p += cinfo.output_width;
}
//if (w) *w = cinfo.output_width;
//if (h) *h = cinfo.output_height;
jpeg_finish_decompress( &cinfo );
}
//jpeg_destroy_decompress(&cinfo);
image_outputted = false;
return AVI_SUCCESS;
}
void AVIMJPEG::Flush()
{
}
int AVIMJPEG::GetPicture( void **data, void **decoder_data )
{
if ( image_outputted )
return AVI_FAILURE;
*data = decoded_image;
*decoder_data = 0;
image_outputted = true;
return AVI_SUCCESS;
}
void AVIMJPEG::FreePicture( void *data, void *decoder_data )
{
}
void AVIMJPEG::Close()
{
delete jpegLoader;
delete this;
}
#define CBCLASS AVIMJPEG
START_DISPATCH;
CB( GET_OUTPUT_PROPERTIES, GetOutputProperties )
CB( DECODE_CHUNK, DecodeChunk )
VCB( FLUSH, Flush )
VCB( CLOSE, Close )
CB( GET_PICTURE, GetPicture )
VCB( FREE_PICTURE, FreePicture )
END_DISPATCH;
#undef CBCLASS

View file

@ -0,0 +1,50 @@
#pragma once
#include "../Plugins/Input/in_avi/ifc_avivideodecoder.h"
#include "../Plugins/Input/in_avi/svc_avidecoder.h"
#include "../nsavi/avi_header.h"
#include "loader_jpg.h"
extern "C"
{
#undef FAR
#include "jpeglib.h"
};
// {F54E12B2-1B6B-48ac-B65D-F33B690A4F81}
static const GUID avi_jpeg_guid =
{ 0xf54e12b2, 0x1b6b, 0x48ac, { 0xb6, 0x5d, 0xf3, 0x3b, 0x69, 0xa, 0x4f, 0x81 } };
class AVIDecoderCreator : public svc_avidecoder
{
public:
static const char *getServiceName() { return "JPEG AVI Decoder"; }
static GUID getServiceGuid() { return avi_jpeg_guid; }
int CreateVideoDecoder(const nsavi::AVIH *avi_header, const nsavi::STRH *stream_header, const nsavi::STRF *stream_format, const nsavi::STRD *stream_data, ifc_avivideodecoder **decoder);
protected:
RECVS_DISPATCH;
};
class AVIMJPEG : public ifc_avivideodecoder
{
public:
AVIMJPEG(nsavi::video_format *stream_format);
static AVIMJPEG *CreateDecoder(nsavi::video_format *stream_format);
int GetOutputProperties(int *x, int *y, int *color_format, double *aspect_ratio, int *flip);
int DecodeChunk(uint16_t type, const void *inputBuffer, size_t inputBufferBytes);
void Flush();
void Close();
int GetPicture(void **data, void **decoder_data);
void FreePicture(void *data, void *decoder_data);
private:
nsavi::video_format *stream_format;
JpgLoad *jpegLoader;
int width, height;
int image_size;
void *decoded_image; // UYVY
bool image_outputted;
jpeg_decompress_struct cinfo;
jpeg_error_mgr jerr;
protected:
RECVS_DISPATCH;
};

76
Src/jpeg/jpeg.rc Normal file
View file

@ -0,0 +1,76 @@
// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
#pragma code_page(1252)
#endif //_WIN32
#endif // English (U.S.) resources
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
// English (U.K.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENG)
#ifdef _WIN32
LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_UK
#pragma code_page(1252)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"#include ""version.rc2""\r\n"
"\0"
END
#endif // APSTUDIO_INVOKED
#endif // English (U.K.) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#include "version.rc2"
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED

43
Src/jpeg/jpeg.sln Normal file
View file

@ -0,0 +1,43 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.29424.173
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "jpeg", "jpeg.vcxproj", "{74EADF6F-F023-4D8C-B03A-5258B192A5E2}"
ProjectSection(ProjectDependencies) = postProject
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621} = {4F4B5925-2D0B-48DB-BBB0-D321B14EF621}
EndProjectSection
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ijg", "..\ijg\ijg.vcxproj", "{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Release|Win32 = Release|Win32
Release|x64 = Release|x64
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Debug|Win32.ActiveCfg = Debug|Win32
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Debug|Win32.Build.0 = Debug|Win32
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Debug|x64.ActiveCfg = Debug|x64
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Debug|x64.Build.0 = Debug|x64
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Release|Win32.ActiveCfg = Release|Win32
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Release|Win32.Build.0 = Release|Win32
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Release|x64.ActiveCfg = Release|x64
{74EADF6F-F023-4D8C-B03A-5258B192A5E2}.Release|x64.Build.0 = Release|x64
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Debug|Win32.ActiveCfg = Debug|Win32
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Debug|Win32.Build.0 = Debug|Win32
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Debug|x64.ActiveCfg = Debug|x64
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Debug|x64.Build.0 = Debug|x64
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Release|Win32.ActiveCfg = Release|Win32
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Release|Win32.Build.0 = Release|Win32
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Release|x64.ActiveCfg = Release|x64
{4F4B5925-2D0B-48DB-BBB0-D321B14EF621}.Release|x64.Build.0 = Release|x64
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {1D358370-7495-448D-BD0B-186B11C8D08E}
EndGlobalSection
EndGlobal

268
Src/jpeg/jpeg.vcxproj Normal file
View file

@ -0,0 +1,268 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<ProjectGuid>{74EADF6F-F023-4D8C-B03A-5258B192A5E2}</ProjectGuid>
<RootNamespace>jpeg</RootNamespace>
<WindowsTargetPlatformVersion>10.0.19041.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<PlatformToolset>v142</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
<TargetExt>.w5s</TargetExt>
<IncludePath>$(IncludePath)</IncludePath>
<LibraryPath>$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
<TargetExt>.w5s</TargetExt>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
<TargetExt>.w5s</TargetExt>
<IncludePath>$(IncludePath)</IncludePath>
<LibraryPath>$(LibraryPath)</LibraryPath>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental>
<OutDir>$(PlatformShortName)_$(Configuration)\</OutDir>
<IntDir>$(PlatformShortName)_$(Configuration)\</IntDir>
<TargetExt>.w5s</TargetExt>
</PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<VcpkgConfiguration>Debug</VcpkgConfiguration>
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
</PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
<VcpkgConfiguration>Debug</VcpkgConfiguration>
</PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
</PropertyGroup>
<PropertyGroup Label="Vcpkg" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<VcpkgTriplet>x86-windows-static-md</VcpkgTriplet>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.;../Wasabi;../libmp4v2;../libmp4v2/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;JPEG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
<AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(ProjectName).w5s</OutputFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<ImportLibrary>$(ProjectDir)x86_Debug\$(ProjectName).lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\
xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<Optimization>Disabled</Optimization>
<AdditionalIncludeDirectories>.;../Wasabi;../libmp4v2;../libmp4v2/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN64;_DEBUG;_WINDOWS;_USRDLL;JPEG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
<AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(ProjectName).w5s</OutputFile>
<GenerateDebugInformation>true</GenerateDebugInformation>
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<ImportLibrary>$(ProjectDir)x64_Debug\$(ProjectName).lib</ImportLibrary>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\
xcopy /Y /D $(IntDir)$(TargetName).pdb ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<Optimization>MinSpace</Optimization>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>.;../Wasabi;../libmp4v2;../libmp4v2/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;JPEG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>true</BufferSecurityCheck>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>None</DebugInformationFormat>
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
<AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(ProjectName).w5s</OutputFile>
<GenerateDebugInformation>false</GenerateDebugInformation>
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<ImportLibrary>$(ProjectDir)x86_Release\$(ProjectName).lib</ImportLibrary>
<TargetMachine>MachineX86</TargetMachine>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<Optimization>MinSpace</Optimization>
<FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>
<AdditionalIncludeDirectories>.;../Wasabi;../libmp4v2;../libmp4v2/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<PreprocessorDefinitions>WIN64;NDEBUG;_WINDOWS;_USRDLL;JPEG_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<StringPooling>true</StringPooling>
<MultiProcessorCompilation>true</MultiProcessorCompilation>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<BufferSecurityCheck>true</BufferSecurityCheck>
<TreatWChar_tAsBuiltInType>true</TreatWChar_tAsBuiltInType>
<WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>None</DebugInformationFormat>
<ProgramDataBaseFileName>$(IntDir)$(TargetName).pdb</ProgramDataBaseFileName>
</ClCompile>
<Link>
<AdditionalDependencies>shlwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
<OutputFile>$(OutDir)$(ProjectName).w5s</OutputFile>
<GenerateDebugInformation>false</GenerateDebugInformation>
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
<SubSystem>Windows</SubSystem>
<OptimizeReferences>true</OptimizeReferences>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<RandomizedBaseAddress>false</RandomizedBaseAddress>
<ImportLibrary>$(ProjectDir)x64_Release\$(ProjectName).lib</ImportLibrary>
<ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
<AdditionalLibraryDirectories>%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
</Link>
<PostBuildEvent>
<Command>xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\ </Command>
<Message>Post build event: 'xcopy /Y /D $(OutDir)$(TargetName)$(TargetExt) ..\..\Build\Winamp_$(PlatformShortName)_$(Configuration)\System\'</Message>
</PostBuildEvent>
</ItemDefinitionGroup>
<ItemGroup>
<ProjectReference Include="..\external_dependencies\libmp4v2\libmp4v2.vcxproj">
<Project>{efb9b882-6a8b-463d-a8e3-a2807afc5d9f}</Project>
</ProjectReference>
<ProjectReference Include="..\Wasabi\Wasabi.vcxproj">
<Project>{3e0bfa8a-b86a-42e9-a33f-ec294f823f7f}</Project>
</ProjectReference>
</ItemGroup>
<ItemGroup>
<ClCompile Include="amg.cpp" />
<ClCompile Include="avi_mjpg_decoder.cpp" />
<ClCompile Include="loader_jpg.cpp" />
<ClCompile Include="mp4_jpeg_decoder.cpp" />
<ClCompile Include="w5s.cpp" />
<ClCompile Include="writer_jpg.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\Wasabi\api\service\svcs\svc_imgload.h" />
<ClInclude Include="..\Wasabi\api\service\svcs\svc_imgwrite.h" />
<ClInclude Include="amg.h" />
<ClInclude Include="api__jpeg.h" />
<ClInclude Include="avi_mjpg_decoder.h" />
<ClInclude Include="loader_jpg.h" />
<ClInclude Include="main.h" />
<ClInclude Include="mp4_jpeg_decoder.h" />
<ClInclude Include="resource.h" />
<ClInclude Include="w5s.h" />
<ClInclude Include="writer_jpg.h" />
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="jpeg.rc" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

View file

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ClCompile Include="amg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="avi_mjpg_decoder.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="loader_jpg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="mp4_jpeg_decoder.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="w5s.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="writer_jpg.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="amg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="api__jpeg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="avi_mjpg_decoder.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="loader_jpg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="main.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="mp4_jpeg_decoder.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="resource.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Wasabi\api\service\svcs\svc_imgload.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="..\Wasabi\api\service\svcs\svc_imgwrite.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="w5s.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="writer_jpg.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<Filter Include="Header Files">
<UniqueIdentifier>{c34a3258-e5bd-4d12-9c43-db9aff734101}</UniqueIdentifier>
</Filter>
<Filter Include="Source Files">
<UniqueIdentifier>{a0ca09db-4077-4800-9f71-92c88a75bc27}</UniqueIdentifier>
</Filter>
<Filter Include="Ressource Files">
<UniqueIdentifier>{fbabf673-97e4-4a24-b3b5-4c0848ca40b3}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ResourceCompile Include="jpeg.rc">
<Filter>Ressource Files</Filter>
</ResourceCompile>
</ItemGroup>
</Project>

223
Src/jpeg/loader_jpg.cpp Normal file
View file

@ -0,0 +1,223 @@
#include "main.h"
#include "loader_jpg.h"
#include "api__jpeg.h"
#include "../xml/ifc_xmlreaderparams.h"
#include <api/memmgr/api_memmgr.h>
#include <shlwapi.h>
#include <setjmp.h>
#include <wingdi.h>
#include <intsafe.h>
/*BIG BIG THING TO NOTE
I have modified jmorecfg.h line 319 to specify 4 bytes per pixel with RGB. it is normally three.
*/
extern "C"
{
#undef FAR
#include "jpeglib.h"
};
int JpgLoad::isMine( const wchar_t *filename )
{
if ( !filename )
return 0;
const wchar_t *ext = PathFindExtensionW( filename );
if ( !ext )
return 0;
if ( !_wcsicmp( ext, L".jpg" ) )
return 1;
if ( !_wcsicmp( ext, L".jpeg" ) )
return 1;
return 0;
}
const wchar_t *JpgLoad::mimeType()
{
return L"image/jpeg";
}
int JpgLoad::getHeaderSize()
{
return 3;
}
int JpgLoad::testData( const void *data, int datalen )
{
if ( datalen < 3 )
return 0;
const unsigned __int8 *text = static_cast<const unsigned __int8 *>( data );
if ( text[ 0 ] == 0xFF && text[ 1 ] == 0xD8 && text[ 2 ] == 0xFF )
return 1;
return 0;
}
/*
struct jpeg_source_mgr {
const JOCTET * next_input_byte; // => next byte to read from buffer
size_t bytes_in_buffer; // # of bytes remaining in buffer
JMETHOD(void, init_source, (j_decompress_ptr cinfo));
JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo));
JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes));
JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired));
JMETHOD(void, term_source, (j_decompress_ptr cinfo));
};
*/
// our reader...
extern "C"
{
static void init_source( j_decompress_ptr cinfo )
{}
static const JOCTET jpeg_eof[] = { (JOCTET)0xFF, (JOCTET)JPEG_EOI };
static boolean fill_input_buffer( j_decompress_ptr cinfo )
{
cinfo->src->next_input_byte = jpeg_eof;
cinfo->src->bytes_in_buffer = 2;
return TRUE;
}
static void skip_input_data( j_decompress_ptr cinfo, long num_bytes )
{
//my_src_ptr src = (my_src_ptr) cinfo->src;
if ( num_bytes > 0 )
{
if ( num_bytes > (long)cinfo->src->bytes_in_buffer )
{
fill_input_buffer( cinfo );
}
else
{
cinfo->src->next_input_byte += (size_t)num_bytes;
cinfo->src->bytes_in_buffer -= (size_t)num_bytes;
}
}
}
static void term_source( j_decompress_ptr cinfo )
{}
};
static void wasabi_jpgload_error_exit( j_common_ptr cinfo )
{
jmp_buf *stack_env = (jmp_buf *)cinfo->client_data;
longjmp( *stack_env, 1 );
}
static bool IsAMG( jpeg_saved_marker_ptr marker_list )
{
while ( marker_list )
{
if ( marker_list->marker == JPEG_COM && marker_list->data_length == 7 && memcmp( (const char *)marker_list->data, "AMG/AOL", 7 ) == 0 )
{
return true;
}
marker_list = marker_list->next;
}
return false;
}
ARGB32 *JpgLoad::loadImage( const void *data, int datalen, int *w, int *h, ifc_xmlreaderparams *params )
{
int fail_on_amg = 0;
if ( params ) // epic failness
fail_on_amg = params->getItemValueInt( L"AMG", 0 );
ARGB32 *buf = 0;
jpeg_error_mgr jerr;
jpeg_decompress_struct cinfo;
jpeg_source_mgr src = { (const JOCTET *)data,(size_t)datalen,init_source,fill_input_buffer,skip_input_data,jpeg_resync_to_restart,term_source };
cinfo.err = jpeg_std_error( &jerr );
jpeg_create_decompress( &cinfo );
cinfo.src = &src;
/* set up error handling. basically C style exceptions :) */
jmp_buf stack_env;
cinfo.client_data = &stack_env;
cinfo.err->error_exit = wasabi_jpgload_error_exit;
if ( setjmp( stack_env ) )
{
// longjmp will goto here
jpeg_destroy_decompress( &cinfo );
if ( buf )
WASABI_API_MEMMGR->sysFree( buf );
return 0;
}
if ( fail_on_amg )
jpeg_save_markers( &cinfo, JPEG_COM, 10 );
if ( jpeg_read_header( &cinfo, TRUE ) == JPEG_HEADER_OK )
{
cinfo.out_color_space = JCS_RGB;
/*int ret = */jpeg_start_decompress( &cinfo );
if ( !fail_on_amg || !IsAMG( cinfo.marker_list ) )
{
size_t image_size = 0;
if ( SizeTMult( cinfo.output_width, cinfo.output_height, &image_size ) == S_OK && SizeTMult( image_size, 4, &image_size ) == S_OK )
{
buf = (ARGB32 *)WASABI_API_MEMMGR->sysMalloc( image_size );
int row_stride = cinfo.output_width * cinfo.output_components;
ARGB32 *p = buf;// + (cinfo.output_width * cinfo.output_height);
void* line = malloc(row_stride);
while ( cinfo.output_scanline < cinfo.output_height )
{
//p -= cinfo.output_width;
jpeg_read_scanlines( &cinfo, (JSAMPARRAY)&line, 1 );
unsigned char* rgb = (unsigned char*)line;
unsigned char* argb = (unsigned char*)p;
for (size_t i = 0; i < cinfo.output_width; i++)
{
argb[4 * i] = rgb[3 * i + 2];
argb[4 * i + 1] = rgb[3 * i + 1];
argb[4 * i + 2] = rgb[3 * i];
argb[4 * i + 3] = 0xff;
}
p += cinfo.output_width;
}
free(line);
if ( w )
*w = cinfo.output_width;
if ( h )
*h = cinfo.output_height;
jpeg_finish_decompress( &cinfo );
}
}
}
jpeg_destroy_decompress( &cinfo );
return buf;
}
#define CBCLASS JpgLoad
START_DISPATCH;
CB( ISMINE, isMine );
CB( MIMETYPE, mimeType );
CB( TESTDATA, testData );
CB( GETHEADERSIZE, getHeaderSize );
CB( LOADIMAGE, loadImage );
END_DISPATCH;
#undef CBCLASS

23
Src/jpeg/loader_jpg.h Normal file
View file

@ -0,0 +1,23 @@
#pragma once
#include <api/service/svcs/svc_imgload.h>
// {AE04FB30-53F5-4032-BD29-032B87EC3404}
static const GUID JPEGguid =
{ 0xae04fb30, 0x53f5, 0x4032, { 0xbd, 0x29, 0x3, 0x2b, 0x87, 0xec, 0x34, 0x04 } };
class JpgLoad : public svc_imageLoader
{
public:
static const char *getServiceName() { return "JPEG loader"; }
static GUID getServiceGuid() { return JPEGguid; }
int isMine(const wchar_t *filename);
const wchar_t *mimeType();
int getHeaderSize();
int testData(const void *data, int datalen);
ARGB32 *loadImage(const void *data, int datalen, int *w, int *h, ifc_xmlreaderparams *params=NULL);
protected:
RECVS_DISPATCH;
};

6
Src/jpeg/main.h Normal file
View file

@ -0,0 +1,6 @@
#ifndef NULLSOFT_JPEG_MAIN_H
#define NULLSOFT_JPEG_MAIN_H
//extern bool isMMX;
#endif

View file

@ -0,0 +1,91 @@
#include "mp4_jpeg_decoder.h"
#include "api__jpeg.h"
#include <api/service/waservicefactory.h>
MP4JPEGDecoder::MP4JPEGDecoder()
{
jpegLoader=0;
width=0;
height=0;
decoded_image = 0;
}
int MP4JPEGDecoder::Open(MP4FileHandle mp4_file, MP4TrackId mp4_track)
{
// load JPEG loader
jpegLoader = new JpgLoad;
if (jpegLoader)
return MP4_VIDEO_SUCCESS;
else
return MP4_VIDEO_FAILURE;
}
void MP4JPEGDecoder::Close()
{
delete jpegLoader;
delete this;
}
int MP4JPEGDecoder::GetOutputFormat(int *x, int *y, int *color_format, double *aspect_ratio)
{
if (!height || !width)
return MP4_VIDEO_FAILURE;
*x = width;
*y = height;
*color_format = '23GR'; // RGB32
return MP4_VIDEO_SUCCESS;
}
int MP4JPEGDecoder::DecodeSample(const void *inputBuffer, size_t inputBufferBytes, MP4Timestamp timestamp)
{
bool change_in_size=false;
if (decoded_image)
WASABI_API_MEMMGR->sysFree(decoded_image);
int decode_width, decode_height;
decoded_image = jpegLoader->loadImage(inputBuffer, (int)inputBufferBytes, &decode_width, &decode_height);
if (!decoded_image)
return MP4_VIDEO_FAILURE;
if (width && decode_width != width // if we have a different width from last time
|| height && decode_height != height)
change_in_size = true;
width = decode_width;
height = decode_height;
return change_in_size?MP4_VIDEO_OUTPUT_FORMAT_CHANGED:MP4_VIDEO_SUCCESS;
}
int MP4JPEGDecoder::CanHandleCodec(const char *codecName)
{
return !strcmp(codecName, "jpeg");
}
int MP4JPEGDecoder::GetPicture(void **data, void **decoder_data, MP4Timestamp *timestamp)
{
if (!decoded_image)
return MP4_VIDEO_FAILURE;
*data = decoded_image;
*decoder_data = 0;
decoded_image = 0; // wipe our hands clean of it so we don't double free
return MP4_VIDEO_SUCCESS;
}
void MP4JPEGDecoder::FreePicture(void *data, void *decoder_data)
{
WASABI_API_MEMMGR->sysFree(data);
}
#define CBCLASS MP4JPEGDecoder
START_DISPATCH;
CB(MPEG4_VIDEO_OPEN, Open)
CB(MPEG4_VIDEO_GETOUTPUTFORMAT, GetOutputFormat)
CB(MPEG4_VIDEO_DECODE, DecodeSample)
CB(MPEG4_VIDEO_HANDLES_CODEC, CanHandleCodec)
CB(MPEG4_VIDEO_GET_PICTURE, GetPicture)
VCB(MPEG4_VIDEO_FREE_PICTURE, FreePicture)
END_DISPATCH;
#undef CBCLASS

View file

@ -0,0 +1,29 @@
#include "../Plugins/Input/in_mp4/mpeg4video.h"
#include "loader_jpg.h"
// {CFF4B746-8D98-48c1-BDDF-9AA750F51517}
static const GUID mp4_jpeg_guid =
{ 0xcff4b746, 0x8d98, 0x48c1, { 0xbd, 0xdf, 0x9a, 0xa7, 0x50, 0xf5, 0x15, 0x17 } };
class MP4JPEGDecoder : public MP4VideoDecoder
{
public:
static const char *getServiceName() { return "JPEG MP4 Decoder"; }
static GUID getServiceGuid() { return mp4_jpeg_guid; }
MP4JPEGDecoder();
int Open(MP4FileHandle mp4_file, MP4TrackId mp4_track);
int GetOutputFormat(int *x, int *y, int *color_format, double *aspect_ratio);
int DecodeSample(const void *inputBuffer, size_t inputBufferBytes, MP4Timestamp timestamp);
void Close();
int CanHandleCodec(const char *codecName);
int GetPicture(void **data, void **decoder_data, MP4Timestamp *timestamp);
void FreePicture(void *data, void *decoder_data);
protected:
RECVS_DISPATCH;
private:
JpgLoad *jpegLoader; // new during Open(), since we might have been created just for CanHandleCodec
int width, height;
void *decoded_image; // ARGB32
};

14
Src/jpeg/resource.h Normal file
View file

@ -0,0 +1,14 @@
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by jpeg.rc
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 101
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif

39
Src/jpeg/version.rc2 Normal file
View file

@ -0,0 +1,39 @@
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
#include "../Winamp/buildType.h"
VS_VERSION_INFO VERSIONINFO
FILEVERSION WINAMP_PRODUCTVER
PRODUCTVERSION WINAMP_PRODUCTVER
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x2L
FILESUBTYPE 0x0L
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904b0"
BEGIN
VALUE "CompanyName", "Winamp SA"
VALUE "FileDescription", "Winamp 5.x System Component"
VALUE "FileVersion", STR_WINAMP_PRODUCTVER
VALUE "InternalName", "jpeg.w5s"
VALUE "LegalCopyright", "Copyright © 2005-2023 Winamp SA"
VALUE "LegalTrademarks", "Nullsoft and Winamp are trademarks of Winamp SA"
VALUE "OriginalFilename", "jpeg.w5s"
VALUE "ProductName", "Winamp JPEG Image Service"
VALUE "ProductVersion", STR_WINAMP_PRODUCTVER
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1200
END
END

96
Src/jpeg/w5s.cpp Normal file
View file

@ -0,0 +1,96 @@
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include "api__jpeg.h"
#include "main.h"
#include "w5s.h"
#include "writer_jpg.h"
#include "loader_jpg.h"
#include "mp4_jpeg_decoder.h"
#include "avi_mjpg_decoder.h"
#include "../nu/Singleton.h"
#include "../nu/factoryt.h"
#include "amg.h"
/*
void MMXInit()
{
DWORD retval1, retval2;
__try {
_asm {
mov eax, 1 // set up CPUID to return processor version and features
// 0 = vendor string, 1 = version info, 2 = cache info
_emit 0x0f // code bytes = 0fh, 0a2h
_emit 0xa2
mov retval1, eax
mov retval2, edx
}
} __except(EXCEPTION_EXECUTE_HANDLER) { retval1 = retval2 = 0;}
isMMX = retval1 && (retval2 & 0x800000);
}
*/
static ServiceFactoryT<MP4VideoDecoder, MP4JPEGDecoder> mp4Factory;
static ServiceFactoryT<svc_imageWriter, JpgWrite> jpegWriterFactory;
static ServiceFactoryT<svc_imageLoader, JpgLoad> jpegLoaderFactory;
static WA5_JPEG wa5_jpeg;
static AMGSucks amgSucks;
static SingletonServiceFactory<api_amgsucks, AMGSucks> amgSucksFactory;
static AVIDecoderCreator aviCreator;
static SingletonServiceFactory<svc_avidecoder, AVIDecoderCreator> aviFactory;
//bool isMMX=false;
api_service *serviceManager=0;
api_memmgr *memoryManager=0;
void WA5_JPEG::RegisterServices(api_service *service)
{
//MMXInit();
WASABI_API_SVC = service;
// get memory manager
waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(memMgrApiServiceGuid);
if (sf) memoryManager = reinterpret_cast<api_memmgr *>(sf->getInterface());
WASABI_API_SVC->service_register(&jpegLoaderFactory);
WASABI_API_SVC->service_register(&jpegWriterFactory);
WASABI_API_SVC->service_register(&mp4Factory);
amgSucksFactory.Register(WASABI_API_SVC, &amgSucks);
aviFactory.Register(WASABI_API_SVC, &aviCreator);
}
int WA5_JPEG::RegisterServicesSafeModeOk()
{
return 1;
}
void WA5_JPEG::DeregisterServices(api_service *service)
{
service->service_deregister(&jpegWriterFactory);
service->service_deregister(&jpegLoaderFactory);
service->service_deregister(&mp4Factory);
amgSucksFactory.Deregister(service);
aviFactory.Deregister(WASABI_API_SVC);
waServiceFactory *sf = WASABI_API_SVC->service_getServiceByGuid(memMgrApiServiceGuid);
if (sf) sf->releaseInterface(memoryManager);
}
extern "C" __declspec(dllexport) ifc_wa5component *GetWinamp5SystemComponent()
{
return &wa5_jpeg;
}
#ifdef CBCLASS
#undef CBCLASS
#endif
#define CBCLASS WA5_JPEG
START_DISPATCH;
VCB(API_WA5COMPONENT_REGISTERSERVICES, RegisterServices)
CB(15, RegisterServicesSafeModeOk)
VCB(API_WA5COMPONENT_DEREEGISTERSERVICES, DeregisterServices)
END_DISPATCH;

15
Src/jpeg/w5s.h Normal file
View file

@ -0,0 +1,15 @@
#ifndef __WASABI_WA5_JPEG_H
#define __WASABI_WA5_JPEG_H
#include "../Agave/Component/ifc_wa5component.h"
class WA5_JPEG : public ifc_wa5component
{
public:
void RegisterServices(api_service *service);
int RegisterServicesSafeModeOk();
void DeregisterServices(api_service *service);
protected:
RECVS_DISPATCH;
};
#endif

138
Src/jpeg/writer_jpg.cpp Normal file
View file

@ -0,0 +1,138 @@
#include "main.h"
#include "writer_jpg.h"
#include "api__jpeg.h"
#include <api/memmgr/api_memmgr.h>
#include <shlwapi.h>
#include <strsafe.h>
/*BIG BIG THING TO NOTE
I have modified jmorecfg.h line 319 to specify 4 bytes per pixel with RGB. it is normally three.
*/
extern "C" {
#undef FAR
#include "jpeglib.h"
};
JpgWrite::JpgWrite() : quality(80) {}
// valid items include "quality" for jpeg files with value "0" to "100", "lossless" returns "1" if it is "0" otherwise
// return value is 1 if the config item is supported, 0 if it is not.
int JpgWrite::setConfig(const wchar_t * item, const wchar_t * value) {
if(!_wcsicmp(item,L"quality")) quality = _wtoi(value);
else return 0;
return 1;
}
int JpgWrite::getConfig(const wchar_t * item, wchar_t * value, int valuelen) {
if(!_wcsicmp(item,L"lossless")) lstrcpynW(value,L"0",valuelen);
else if(!_wcsicmp(item,L"quality")) StringCchPrintfW(value,valuelen,L"%d",quality);
else return 0;
return 1;
}
int JpgWrite::bitDepthSupported(int depth) {
if(depth == 32 || depth == 24) return 1;
return 0;
}
extern "C" {
typedef struct {
jpeg_destination_mgr pub;
BYTE *buf;
int len;
} my_destination_mgr;
void init_destination(j_compress_ptr cinfo){}
boolean empty_output_buffer(j_compress_ptr cinfo) {
my_destination_mgr* m = (my_destination_mgr*)cinfo->dest;
int used = m->len;
int d = ((m->len / 4) & 0xffffff00) + 0x100;
if(d < 4096) d = 4096;
m->len+=d;
m->buf = (BYTE*)WASABI_API_MEMMGR->sysRealloc(m->buf,m->len);
m->pub.next_output_byte = m->buf + used;
m->pub.free_in_buffer = d;
return TRUE;
}
void term_destination(j_compress_ptr cinfo){}
};
// returns the image in our format, free the returned buffer with api_memmgr::sysFree()
void * JpgWrite::convert(const void *pixels, int bitDepth, int w, int h, int *length) {
if(bitDepth != 32 && bitDepth != 24) return 0;
jpeg_compress_struct cinfo={0};
jpeg_error_mgr jerr;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_compress(&cinfo);
// a guess at the final size...
int allocsize = (int(double(w*h)*0.2) & 0xffffff00) + 0x100;
if (allocsize < 4096) allocsize = 4096;
// set up our output stream
my_destination_mgr dest = {{0,(size_t)allocsize,init_destination,empty_output_buffer,term_destination},0,allocsize};
dest.buf = (BYTE*)WASABI_API_MEMMGR->sysMalloc(allocsize);
dest.pub.next_output_byte = dest.buf;
cinfo.dest = (jpeg_destination_mgr*)&dest;
// image parameters
cinfo.image_width = w;
cinfo.image_height = h;
cinfo.input_components = 4;
cinfo.in_color_space = JCS_RGB;
jpeg_set_defaults(&cinfo);
jpeg_set_quality(&cinfo, quality, TRUE /* limit to baseline-JPEG values */);
jpeg_start_compress(&cinfo, TRUE);
int row_stride = w * 4;
BYTE * scanline = (BYTE *)malloc(row_stride);
if(bitDepth == 32) {
const ARGB32 * p = ((const ARGB32*)pixels);// + (h * w);
while (cinfo.next_scanline < cinfo.image_height) {
//p-=w;
memcpy(scanline,p,row_stride);
for(unsigned int i=0; i < cinfo.image_width; i++)
((ARGB32*)scanline)[i] = ((p[i] & 0x0000ff) << 16) | (p[i] & 0x00ff00) | ((p[i] & 0xff0000) >> 16);
jpeg_write_scanlines(&cinfo, &scanline, 1);
p+=w;
}
} else if(bitDepth == 24) { // FUCKO: untested
const BYTE * p = ((const BYTE*)pixels);// + (h * w * 3);
while (cinfo.next_scanline < cinfo.image_height) {
//p-=w*3;
memcpy(scanline,p,row_stride);
int l = cinfo.image_width * 4;
for(int i=0,j=0; j < l; i+=3,j+=4) {
scanline[j] = p[i+2];
scanline[j+1] = p[i+1];
scanline[j+2] = p[i];
}
jpeg_write_scanlines(&cinfo, &scanline, 1);
p+=w*3;
}
}
free(scanline);
jpeg_finish_compress(&cinfo);
if(length) *length = int(dest.len - dest.pub.free_in_buffer);
jpeg_destroy_compress(&cinfo);
return dest.buf;
}
#define CBCLASS JpgWrite
START_DISPATCH;
CB(GETIMAGETYPENAME, getImageTypeName);
CB(GETEXTENSIONS, getExtensions);
CB(SETCONFIG, setConfig);
CB(GETCONFIG, getConfig);
CB(BITDEPTHSUPPORTED, bitDepthSupported);
CB(CONVERT, convert);
END_DISPATCH;
#undef CBCLASS

25
Src/jpeg/writer_jpg.h Normal file
View file

@ -0,0 +1,25 @@
#pragma once
#include <api/service/svcs/svc_imgwrite.h>
// {7BC27468-0475-4c0d-AEED-0C51195DC2EA}
static const GUID JPEGwriteguid =
{ 0x7bc27468, 0x475, 0x4c0d, { 0xae, 0xed, 0xc, 0x51, 0x19, 0x5d, 0xc2, 0xea } };
class JpgWrite : public svc_imageWriter
{
public:
JpgWrite();
static const char *getServiceName() { return "JPEG writer"; }
static GUID getServiceGuid() { return JPEGwriteguid; }
const wchar_t * getImageTypeName() { return L"JPEG"; }
const wchar_t * getExtensions() { return L"jpg;jpeg"; }
int setConfig(const wchar_t * item, const wchar_t * value);
int getConfig(const wchar_t * item, wchar_t * value, int valuelen);
int bitDepthSupported(int depth);
void * convert(const void *pixels, int bitDepth, int w, int h, int *length);
protected:
RECVS_DISPATCH;
int quality;
};