I read compressed image from libpng .. my EncoderWriteCallback write is ok and running
but the read (EncoderReadCallback) is not ok why?

is the same 1:1 QByteArray wo libpng has writteln ... why now it can not read?
the QByteArray is not from qpixmap or qimage.

on debug qbuffer is readable and having size ..


I start the callback so...
Qt Code:
  1. png_ptr_read = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
  2. if(png_ptr_read == NULL) {
  3. qWarning("unable to create read struct");
  4. return;
  5. }
  6. info_ptr_read = png_create_info_struct(png_ptr_read);
  7. if(info_ptr_read == NULL) {
  8. qWarning("unable to create info struct");
  9. return;
  10. }
  11. png_set_sig_bytes(png_ptr_read, 8);
  12. APNGImageStream myqtchunk(0,frame.stream()); /* stream() = QByteArray */
  13. png_set_read_fn(png_ptr_read,&myqtchunk,EncoderReadCallback);
To copy to clipboard, switch view to plain text mode 

and this is reader and writer
Qt Code:
  1. #define PNG_USER_MEM_SUPPORTED
  2. #define PNG_WRITE_bKGD_SUPPORTED
  3.  
  4.  
  5. ////base ref http://www.littlesvr.ca/apng/tutorial/x148.html
  6. /* png lib from firefox 3 is patch to APNG format! */
  7. #include "../moz_png/png.h"
  8.  
  9. /* device to write or read image frames */
  10. class APNGImageStream {
  11. public:
  12. APNGImageStream( const int mode , QByteArray in = QByteArray() )
  13. :dev(new QBuffer()),bytes(in)
  14. {
  15. dev->setBuffer(&bytes);
  16. if (mode == 1) {
  17. dev->open(QIODevice::WriteOnly);
  18. } else {
  19. dev->open(QIODevice::ReadOnly);
  20. }
  21. }
  22. ~APNGImageStream()
  23. {
  24. dev->close();
  25. }
  26. QBuffer *device() { return dev; }
  27. bool isValid() { return img.loadFromData(dev->data()); }
  28. QByteArray stream() { return dev->data(); }
  29. QImage img;
  30. QBuffer *dev;
  31. QByteArray bytes;
  32. };
  33.  
  34. // Called by libpng to flush its internal buffer to ours.
  35. static void EncoderWriteCallback(png_structp png, png_bytep data,
  36. png_size_t size) {
  37. APNGImageStream *state = static_cast<APNGImageStream*>(png_get_io_ptr(png));
  38. Q_ASSERT(state->device());
  39. state->device()->write((char*)data,size);
  40. }
  41.  
  42. // Called by libpng to read original QByteArray that has self created .
  43. static void EncoderReadCallback(png_structp png, png_bytep data,
  44. png_size_t sizer) {
  45. APNGImageStream *state = static_cast<APNGImageStream*>(png_get_io_ptr(png));
  46. Q_ASSERT(state->device());
  47. qDebug() << "### size to read 1/0 " << state->stream().size() << "," << state->device()->isReadable();
  48. state->device()->read((char*)data,sizer);
  49. qDebug() << "### read callback length " << sizer;
  50. }
To copy to clipboard, switch view to plain text mode