From edec701f8287f0588b5a734ad9dea7aa5583bd42 Mon Sep 17 00:00:00 2001 From: Rodrigo Braz Monteiro Date: Sat, 1 Apr 2006 11:45:38 +0000 Subject: [PATCH] PNG decoding should hopefully be working now, will know after I finish the avisynth filter Originally committed to SVN as r275. --- core/subtitle_format_prs.cpp | 6 ++++++ prs/png_wrap.cpp | 25 +++++++++++++++++++------ prs/prs_file.cpp | 7 ++++++- prs/prs_image.cpp | 8 -------- 4 files changed, 31 insertions(+), 15 deletions(-) diff --git a/core/subtitle_format_prs.cpp b/core/subtitle_format_prs.cpp index 3134cfbe9..c19b9b00c 100644 --- a/core/subtitle_format_prs.cpp +++ b/core/subtitle_format_prs.cpp @@ -124,6 +124,7 @@ void PRSSubtitleFormat::WriteFile(wxString filename,wxString encoding) { progress->SetProgress(0,toDraw); // Render all frames that were detected to contain subtitles + int lastFrameDrawn = 0; int drawn = 0; for (int framen=0;framenGetReadPtr(),frame2->GetReadPtr(),frame1->GetRowSize(),frame1->GetHeight(),frame1->GetPitch(),&x,&y,&maxalpha); if (!bmp.Ok()) continue; + lastFrameDrawn = framen; // Get the list of rectangles std::vector rects; @@ -172,6 +174,10 @@ void PRSSubtitleFormat::WriteFile(wxString filename,wxString encoding) { // Save file file.Save((const char*)filename.mb_str(wxConvLocal)); + + // Test file + PRSVideoFrame testFrame; + file.DrawFrame(lastFrameDrawn,&testFrame); #endif } diff --git a/prs/png_wrap.cpp b/prs/png_wrap.cpp index 7344d1b37..3ce52d066 100644 --- a/prs/png_wrap.cpp +++ b/prs/png_wrap.cpp @@ -85,13 +85,26 @@ void PNGWrapper::Read(PRSVideoFrame *frame) { // 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; ih; 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); + png_bytepp row_pointers = png_get_rows(png_ptr, info_ptr); + + // Get image size + int w = png_get_image_width(png_ptr,info_ptr); + int h = png_get_image_height(png_ptr,info_ptr); + + // Allocate frame data + int bpp = 4; + frame->ownData = true; + frame->data[0] = new char[w*h*bpp]; + frame->w = w; + frame->h = h; + frame->pitch = w; + frame->colorSpace = ColorSpace_RGB32; + + // Copy data to frame + char *dst = frame->data[0]; + for (int i=0;i &blocks) { // Find all blocks that match + unsigned int fn = n; std::list::iterator cur; PRSDisplay *display; for (cur=entryList.begin();cur!=entryList.end();cur++) { display = PRSEntry::GetDisplay(*cur); - if (display) blocks.push_back(display); + if (display) { + if (display->startFrame <= fn && display->endFrame >= fn) { + blocks.push_back(display); + } + } } // Sort them by layer diff --git a/prs/prs_image.cpp b/prs/prs_image.cpp index ac6d1e458..3ab6566d5 100644 --- a/prs/prs_image.cpp +++ b/prs/prs_image.cpp @@ -128,14 +128,6 @@ PRSVideoFrame *PRSImage::GetDecodedFrame() { // Create frame PRSVideoFrame *frame = new PRSVideoFrame; - // Allocate frame data - frame->ownData = true; - frame->data[0] = new char[w*h]; - frame->w = w; - frame->h = h; - frame->pitch = w; - frame->colorSpace = ColorSpace_RGB32; - try { PNGWrapper png; png.SetData(data);