-1

See bottom for updates

I am running into a number of odd problems. For starters, I'm using the latest Eclipse CDT and before implementing do_rot_180, the compiler linked the folder projectName/include but after it now requires specific include/*.h specified below.

Related to that issue, in the project explorer, it seems to think libjpeg.h is missing or invalid despite it being in the folder on the disk.

I am working with libjpeg-9.

eclipse issue

Includes (included what transupp.c and example.c included):

includes in eclipsehard drive includes

Functions (do_rot_180 is from transupp.c and read_JPEG_file is from example.c):

See updated code block below under Edit 2 (pretty much just jpegtran.c code)

This is the rotate function which is unused in jpegtran.c:
//LOCAL(void)
    //do_rot_180 (j_decompress_ptr srcinfo, j_compress_ptr dstinfo,
    //      JDIMENSION x_crop_offset, JDIMENSION y_crop_offset,
    //      jvirt_barray_ptr *src_coef_arrays,
    //      jvirt_barray_ptr *dst_coef_arrays)
    ///* 180 degree rotation is equivalent to
    // *   1. Vertical mirroring;
    // *   2. Horizontal mirroring.
    // * These two steps are merged into a single processing routine.
    // */
    //{
    //  JDIMENSION MCU_cols, MCU_rows, comp_width, comp_height, dst_blk_x, dst_blk_y;
    //  JDIMENSION x_crop_blocks, y_crop_blocks;
    //  int ci, i, j, offset_y;
    //  JBLOCKARRAY src_buffer, dst_buffer;
    //  JBLOCKROW src_row_ptr, dst_row_ptr;
    //  JCOEFPTR src_ptr, dst_ptr;
    //  jpeg_component_info *compptr;
    //
    //  MCU_cols = srcinfo->output_width /
    //    (dstinfo->max_h_samp_factor * dstinfo->min_DCT_h_scaled_size);
    //  MCU_rows = srcinfo->output_height /
    //    (dstinfo->max_v_samp_factor * dstinfo->min_DCT_v_scaled_size);
    //
    //  for (ci = 0; ci < dstinfo->num_components; ci++) {
    //    compptr = dstinfo->comp_info + ci;
    //    comp_width = MCU_cols * compptr->h_samp_factor;
    //    comp_height = MCU_rows * compptr->v_samp_factor;
    //    x_crop_blocks = x_crop_offset * compptr->h_samp_factor;
    //    y_crop_blocks = y_crop_offset * compptr->v_samp_factor;
    //    for (dst_blk_y = 0; dst_blk_y < compptr->height_in_blocks;
    //   dst_blk_y += compptr->v_samp_factor) {
    //      dst_buffer = (*srcinfo->mem->access_virt_barray)
    //  ((j_common_ptr) srcinfo, dst_coef_arrays[ci], dst_blk_y,
    //   (JDIMENSION) compptr->v_samp_factor, TRUE);
    //      if (y_crop_blocks + dst_blk_y < comp_height) {
    //  /* Row is within the vertically mirrorable area. */
    //  src_buffer = (*srcinfo->mem->access_virt_barray)
    //    ((j_common_ptr) srcinfo, src_coef_arrays[ci],
    //     comp_height - y_crop_blocks - dst_blk_y -
    //     (JDIMENSION) compptr->v_samp_factor,
    //     (JDIMENSION) compptr->v_samp_factor, FALSE);
    //      } else {
    //  /* Bottom-edge rows are only mirrored horizontally. */
    //  src_buffer = (*srcinfo->mem->access_virt_barray)
    //    ((j_common_ptr) srcinfo, src_coef_arrays[ci],
    //     dst_blk_y + y_crop_blocks,
    //     (JDIMENSION) compptr->v_samp_factor, FALSE);
    //      }
    //      for (offset_y = 0; offset_y < compptr->v_samp_factor; offset_y++) {
    //  dst_row_ptr = dst_buffer[offset_y];
    //  if (y_crop_blocks + dst_blk_y < comp_height) {
    //    /* Row is within the mirrorable area. */
    //    src_row_ptr = src_buffer[compptr->v_samp_factor - offset_y - 1];
    //    for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
    //      dst_ptr = dst_row_ptr[dst_blk_x];
    //      if (x_crop_blocks + dst_blk_x < comp_width) {
    //        /* Process the blocks that can be mirrored both ways. */
    //        src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];
    //        for (i = 0; i < DCTSIZE; i += 2) {
    //      /* For even row, negate every odd column. */
    //      for (j = 0; j < DCTSIZE; j += 2) {
    //        *dst_ptr++ = *src_ptr++;
    //        *dst_ptr++ = - *src_ptr++;
    //      }
    //      /* For odd row, negate every even column. */
    //      for (j = 0; j < DCTSIZE; j += 2) {
    //        *dst_ptr++ = - *src_ptr++;
    //        *dst_ptr++ = *src_ptr++;
    //      }
    //        }
    //      } else {
    //        /* Any remaining right-edge blocks are only mirrored vertically. */
    //        src_ptr = src_row_ptr[x_crop_blocks + dst_blk_x];
    //        for (i = 0; i < DCTSIZE; i += 2) {
    //      for (j = 0; j < DCTSIZE; j++)
    //        *dst_ptr++ = *src_ptr++;
    //      for (j = 0; j < DCTSIZE; j++)
    //        *dst_ptr++ = - *src_ptr++;
    //        }
    //      }
    //    }
    //  } else {
    //    /* Remaining rows are just mirrored horizontally. */
    //    src_row_ptr = src_buffer[offset_y];
    //    for (dst_blk_x = 0; dst_blk_x < compptr->width_in_blocks; dst_blk_x++) {
    //      if (x_crop_blocks + dst_blk_x < comp_width) {
    //        /* Process the blocks that can be mirrored. */
    //        dst_ptr = dst_row_ptr[dst_blk_x];
    //        src_ptr = src_row_ptr[comp_width - x_crop_blocks - dst_blk_x - 1];
    //        for (i = 0; i < DCTSIZE2; i += 2) {
    //      *dst_ptr++ = *src_ptr++;
    //      *dst_ptr++ = - *src_ptr++;
    //        }
    //      } else {
    //        /* Any remaining right-edge blocks are only copied. */
    //        jcopy_block_row(src_row_ptr + dst_blk_x + x_crop_blocks,
    //                dst_row_ptr + dst_blk_x,
    //                (JDIMENSION) 1);
    //      }
    //    }
    //  }
    //      }
    //    }
    //  }
    //}

On top of that, I can't actually find where jcopy_block_row is defined. I've looked through all of the include files and their .c counterparts.

I commented out the error handling stuff in the read_JPEG_file function and want to call do_rot_180 from within but I haven't gotten that far yet.

The only clue I've found is this in transupp.c:

transupp.c

Additional note: jpegtran.exe works separately with the compiled .DLL so it's got to be somewhere.


Edit - copied jpegint.h over into include/ which resolved the include issues.

#ifdef JPEG_INTERNALS
#include "jpegint.h"        /* fetch private declarations */
#include "jerror.h"     /* fetch error codes too */
#endif

Now it's unable to compile even though they all seem to be declared in jpeglib.h or jpegint.h:

undefined referenced (4)


Edit 2 - code now contains jpegtran.c stuff for just being able to rotate 180 degrees. Updated code block:

/*********************************************************************************/
/* Defines                                                                       */
/*********************************************************************************/

#define JPEG_INTERNALS

/*********************************************************************************/
/* Includes                                                                      */
/*********************************************************************************/

#include <stdio.h>
#include <iostream>

#include "jinclude.h"
#include "jpeglib.h"
#include "cdjpeg.h"
#include "transupp.h"
#include "jerror.h"

#include <ctype.h>
#include <setjmp.h>

//using namespace std;


static char * infilename;
static char * outfilename;
static JCOPY_OPTION copyoption;
static jpeg_transform_info transformoption;

FILE * infile;
FILE * outfile;


void openFile(char file) {
    if(file == 'i') {
        infile = fopen(infilename, "rb");
    }
    else if(file == 'o') {
        outfile = fopen(outfilename, "wb");
    }
}

/*********************************************************************************/
/* Main Execution Block                                                          */
/*********************************************************************************/

int main() {
    struct jpeg_decompress_struct srcinfo;
    struct jpeg_compress_struct dstinfo;
    struct jpeg_error_mgr jsrcerr, jdsterr;

    jvirt_barray_ptr * src_coef_arrays;
    jvirt_barray_ptr * dst_coef_arrays;
    //int file_index;

    srcinfo.err = jpeg_std_error(&jsrcerr);
    jpeg_create_decompress(&srcinfo);
    dstinfo.err = jpeg_std_error(&jdsterr);
    jpeg_create_compress(&dstinfo);

    jsrcerr.trace_level = jdsterr.trace_level;
    srcinfo.mem->max_memory_to_use = dstinfo.mem->max_memory_to_use;

    //

    outfilename = NULL;
    copyoption = JCOPYOPT_DEFAULT;
    transformoption.transform = JXFORM_NONE;
    transformoption.trim = FALSE;
    transformoption.force_grayscale = FALSE;

    transformoption.transform = JXFORM_ROT_180;

    //

    std::cout << "Enter a filename to rotate 180 degrees." << std::endl;
    std::cin >> infilename;
    openFile('i');
    std::cout << "Enter the output filename." << std::endl;
    std::cin >> outfilename;
    openFile('o');

    //

    jpeg_stdio_src(&srcinfo, infile);
    jcopy_markers_setup(&srcinfo, copyoption);
    (void) jpeg_read_header(&srcinfo, TRUE);

    jtransform_request_workspace(&srcinfo, &transformoption);

    src_coef_arrays = jpeg_read_coefficients(&srcinfo);
    jpeg_copy_critical_parameters(&srcinfo, &dstinfo);

    dst_coef_arrays = jtransform_adjust_parameters(&srcinfo, &dstinfo,
                             src_coef_arrays,
                             &transformoption);

    jpeg_stdio_dest(&dstinfo, outfile);
    jpeg_write_coefficients(&dstinfo, dst_coef_arrays);
    jcopy_markers_execute(&srcinfo, &dstinfo, copyoption);

    jtransform_execute_transformation(&srcinfo, &dstinfo,
                        src_coef_arrays,
                        &transformoption);

    jpeg_finish_compress(&dstinfo);
    jpeg_destroy_compress(&dstinfo);
    (void) jpeg_finish_decompress(&srcinfo);
    jpeg_destroy_decompress(&srcinfo);

    //

    if (infile != stdin)
        fclose(infile);
    if (outfile != stdout)
        fclose(outfile);

    return 0;
}

/*********************************************************************************/
/* End of Program                                                                */
/*********************************************************************************/

Edit 3 - Made the changes Jeff mentioned and I am running into this problem when compiling it (in Eclipse):

cannot find -lC:\Users\tmp\workspace2\jpegManipulator\lib\libjpeg.a jpegManipulator         C/C++ Problem
Invalid project path: Duplicate path entries found (/jpegManipulator [Include path] base-path:jpegManipulator isSystemInclude:true includePath:include), path: [/jpegManipulator].jpegManipulator pathentry Path Entry Problem

I have workspace directory /lib set as library source and also the specific libjpeg.a library set in the libraries tab - It is definitely in the directory.

If I don't include the specific libjpeg.a file, it complains about missing function references but if I do include it, it complains saying that there is no libjpeg.a to be found. This is for both v9 and v6b.

cannot find -lC:\Users\tmp\workspace2\jpeg6bmanip\libs\libjpeg.a    jpeg6bmanip         C/C++ Problem
cannot find -lC:\Users\tmp\workspace2\jpeg6bmanip\libs\libjpeg.la   jpeg6bmanip         C/C++ Problem

Solution to Edit 3 problem: https://stackoverflow.com/q/14692302/1666510 but new problem after that. Can't run the program or debug it because it claims it cannot find jpeglib.h.

Community
  • 1
  • 1
Enigma
  • 1,247
  • 3
  • 20
  • 51
  • possible duplicate of [Compiling/using libjpeg in Windows for Eclipse](http://stackoverflow.com/questions/14593579/compiling-using-libjpeg-in-windows-for-eclipse) – Enigma Feb 25 '15 at 17:57

1 Answers1

1

I had something similar happen when developing with MinGW a couple of years ago. I had to download the source for libjpeg and build it on my machine in order to get the libjpeg.a file. The source can be found here:

http://www.ijg.org/

The problem that I found when I built this library was that when I executed 'nm libjpeg.a' it became clear that the symbols in cdjpeg.h and transupp.h were not being compiled into the library. I couldn't find a way to do it via configure since I didn't see anything obvious when I did 'configure --help'. Instead I edited the Makefile.in file where it defines the am__objects_1 list of .lo files. I added cdjpeg and transupp at the end like this:

am__objects_1 = jaricom.lo jcapimin.lo jcapistd.lo jcarith.lo \
    jccoefct.lo jccolor.lo jcdctmgr.lo jchuff.lo jcinit.lo \
    jcmainct.lo jcmarker.lo jcmaster.lo jcomapi.lo jcparam.lo \
    jcprepct.lo jcsample.lo jctrans.lo jdapimin.lo jdapistd.lo \
    jdarith.lo jdatadst.lo jdatasrc.lo jdcoefct.lo jdcolor.lo \
    jddctmgr.lo jdhuff.lo jdinput.lo jdmainct.lo jdmarker.lo \
    jdmaster.lo jdmerge.lo jdpostct.lo jdsample.lo jdtrans.lo \
    jerror.lo jfdctflt.lo jfdctfst.lo jfdctint.lo jidctflt.lo \
    jidctfst.lo jidctint.lo jquant1.lo jquant2.lo jutils.lo \
    jmemmgr.lo cdjpeg.lo transupp.lo @MEMORYMGR@.lo

Then I did a 'make' and a 'make install' and the symbols were present in the library. At that point I was able to get your code to build. An autotools expert may be able to come up with a better way to do it but this will at least get you going.

Jeff White
  • 43
  • 7
  • Thanks for the suggestion, I'll give this a try. That certainly sounds like whats happening.. or not happening. – Enigma Feb 03 '13 at 17:01
  • In version 6b there doesn't appear to be any am_objects_1 declared in the makefile. Is there something else I can do for that? (Trying in v9 right now) – Enigma Feb 04 '13 at 15:04
  • I don't think you want to add it to Makefile. Putting it in Makefile.in should automatically put the .o references in the proper location in Makefile. Do you get the same message when you add it to just Makefile.in? It sounds like maybe a typo in the Makefile.in somewhere. – Jeff White Feb 04 '13 at 15:07
  • 1
    I downloaded jpegsr6b.zip and looked at the Makefile. It looks like you would need to append cdjpeg.c and transupp.c to the LIB_SOURCES token. – Jeff White Feb 04 '13 at 15:15
  • I'll try the 6b change. Makefile set itself back to what was required during the ./configure - it seems happier overall in terms of accepting the functions in the IDE but when I go to compile it I get the issue noted in Edit 3 above. – Enigma Feb 04 '13 at 15:21
  • So to clarify - my first solution should work for v9 while the second is appropriate for v6b. – Jeff White Feb 04 '13 at 15:23
  • Right, I made the changes accordingly. Just as a note, the actual functions in question seem to be located in libjpeg.h ie `EXTERN(void) jtransform_execute_transformation JPP((j_decompress_ptr srcinfo, j_compress_ptr dstinfo, jvirt_barray_ptr *src_coef_arrays, jpeg_transform_info *info));` - some also in transupp.h – Enigma Feb 04 '13 at 15:25
  • am__objects_1 does not exist anywhere in the v6b Makefile so you have to take it out in order to compile. As long as you put the two .c files on the LIB_SOURCES line it should compile those symbols into the .a file. – Jeff White Feb 04 '13 at 15:32
  • Look at edit 3 above. What you suggested seems to work to an extent but there may be something else wrong with how I have the project set up. – Enigma Feb 04 '13 at 15:34
  • Also, in terms of 6b, after running ./configure and make, I noticed that the .c files I added to LIBSOURCES were removed (There is no LIB_SOURCES for me). Should I not be running ./configure after I make changes? – Enigma Feb 04 '13 at 15:49
  • ./configure is overwriting the contents of Makefile with the settings in makefile.cfg which is why your new LIBSOURCES setting is going away. I tried making changes in makefile.cfg instead but the make system keeps saying there is no rule for cdjpeg. It is confusing since there is a rule for it further down in the Makefile. Does your code build under v9? – Jeff White Feb 04 '13 at 16:16
  • Under v9 I am experiencing the same issue as under v6b where the libjpeg.a file just isn't found as noted in Edit 3 in at the bottom on the question. – Enigma Feb 04 '13 at 16:18
  • 1
    Maybe try giving this a shot: http://stackoverflow.com/questions/307367/eclipse-cdt-invalid-project-path – Jeff White Feb 04 '13 at 18:49
  • Tried those suggestions already - Did this though: http://stackoverflow.com/q/14692302/1666510 – Enigma Feb 04 '13 at 18:58
  • If I right click project -> index -> search for unresolved includes, it turns up with nothing yet when I debug It says source file jpeglib.h not found (AFTER it compiles just fine) - It has to do with runtime. – Enigma Feb 04 '13 at 19:02