Finished PNG loading, but totally untested
Originally committed to SVN as r274.
This commit is contained in:
parent
121c81a157
commit
065056157c
3 changed files with 55 additions and 14 deletions
|
@ -38,6 +38,7 @@
|
|||
// Headers
|
||||
#include <png.h>
|
||||
#include "png_wrap.h"
|
||||
#include "prs_video_frame.h"
|
||||
|
||||
|
||||
///////////////
|
||||
|
@ -57,18 +58,9 @@ PNGWrapper::~PNGWrapper() {
|
|||
|
||||
//////////////
|
||||
// Read image
|
||||
void PNGWrapper::Read(void *dst) {
|
||||
// Check initialization
|
||||
if (!initialized) Begin();
|
||||
}
|
||||
|
||||
|
||||
//////////////
|
||||
// Initialize
|
||||
void PNGWrapper::Begin() {
|
||||
// Check initialization
|
||||
if (initialized) End();
|
||||
initialized = true;
|
||||
void PNGWrapper::Read(PRSVideoFrame *frame) {
|
||||
// Begin
|
||||
Begin();
|
||||
|
||||
// Initialize libpng structures
|
||||
png_structp png_ptr = png_create_read_struct (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
|
||||
|
@ -90,6 +82,29 @@ void PNGWrapper::Begin() {
|
|||
throw 1;
|
||||
}
|
||||
|
||||
// Set data reading
|
||||
png_set_read_fn(png_ptr,this,memory_read_data);
|
||||
|
||||
// Set row pointers
|
||||
png_bytepp row_pointers = (png_bytep *) png_malloc(png_ptr, frame->h*sizeof(png_bytep));
|
||||
for (int i=0; i<frame->h; i++) row_pointers[i] = (png_bytep) (frame->data[0] + frame->w*i);
|
||||
png_set_rows(png_ptr, info_ptr, row_pointers);
|
||||
|
||||
// Read data
|
||||
png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL);
|
||||
|
||||
// Clean up
|
||||
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
|
||||
End();
|
||||
}
|
||||
|
||||
|
||||
//////////////
|
||||
// Initialize
|
||||
void PNGWrapper::Begin() {
|
||||
// Check initialization
|
||||
if (initialized) End();
|
||||
initialized = true;
|
||||
}
|
||||
|
||||
|
||||
|
@ -100,3 +115,16 @@ void PNGWrapper::End() {
|
|||
if (!initialized) return;
|
||||
initialized = false;
|
||||
}
|
||||
|
||||
|
||||
/////////////
|
||||
// Read data
|
||||
void PNGWrapper::memory_read_data(png_structp png_ptr, png_bytep dstData, png_size_t length) {
|
||||
PNGWrapper *wrapper = (PNGWrapper*) png_get_io_ptr(png_ptr);
|
||||
wrapper->ReadData(dstData,length);
|
||||
}
|
||||
|
||||
void PNGWrapper::ReadData(png_bytep dstData, png_size_t length) {
|
||||
memcpy(dstData,((char*)data)+pos,length);
|
||||
pos++;
|
||||
}
|
||||
|
|
|
@ -34,6 +34,16 @@
|
|||
//
|
||||
|
||||
|
||||
///////////
|
||||
// Headers
|
||||
#include <png.h>
|
||||
|
||||
|
||||
//////////////
|
||||
// Prototypes
|
||||
class PRSVideoFrame;
|
||||
|
||||
|
||||
/////////////////////
|
||||
// PNG Wrapper class
|
||||
class PNGWrapper {
|
||||
|
@ -45,6 +55,9 @@ private:
|
|||
void Begin();
|
||||
void End();
|
||||
|
||||
static void memory_read_data(png_structp png_ptr, png_bytep data, png_size_t length);
|
||||
void ReadData(png_bytep data, png_size_t length);
|
||||
|
||||
public:
|
||||
PNGWrapper();
|
||||
~PNGWrapper();
|
||||
|
@ -52,5 +65,5 @@ public:
|
|||
void SetData(void *ptr) { data = ptr; pos = 0; }
|
||||
void *GetData() { return data; }
|
||||
|
||||
void Read(void *dst);
|
||||
void Read(PRSVideoFrame *dst);
|
||||
};
|
||||
|
|
|
@ -139,7 +139,7 @@ PRSVideoFrame *PRSImage::GetDecodedFrame() {
|
|||
try {
|
||||
PNGWrapper png;
|
||||
png.SetData(data);
|
||||
png.Read(frame->data[0]);
|
||||
png.Read(frame);
|
||||
}
|
||||
|
||||
// Handle errors
|
||||
|
|
Loading…
Reference in a new issue