Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(190)

Side by Side Diff: core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.c

Issue 589243004: Update openjpeg (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@master
Patch Set: Update to openjpeg r2891 Created 6 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * The copyright in this software is being made available under the 2-clauses 2 * The copyright in this software is being made available under the 2-clauses
3 * BSD License, included below. This software may be subject to other third 3 * BSD License, included below. This software may be subject to other third
4 * party and contributor rights, including patent rights, and no such rights 4 * party and contributor rights, including patent rights, and no such rights
5 * are granted under this license. 5 * are granted under this license.
6 * 6 *
7 * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium 7 * Copyright (c) 2002-2014, Universite catholique de Louvain (UCL), Belgium
8 * Copyright (c) 2002-2014, Professor Benoit Macq 8 * Copyright (c) 2002-2014, Professor Benoit Macq
9 * Copyright (c) 2001-2003, David Janssens 9 * Copyright (c) 2001-2003, David Janssens
10 * Copyright (c) 2002-2003, Yannick Verschueren 10 * Copyright (c) 2002-2003, Yannick Verschueren
(...skipping 519 matching lines...) Expand 10 before | Expand all | Expand 10 after
530 } 530 }
531 531
532 opj_read_bytes(p_image_header_data,&(jp2->h),4); /* HEIGHT */ 532 opj_read_bytes(p_image_header_data,&(jp2->h),4); /* HEIGHT */
533 p_image_header_data += 4; 533 p_image_header_data += 4;
534 opj_read_bytes(p_image_header_data,&(jp2->w),4); /* WIDTH */ 534 opj_read_bytes(p_image_header_data,&(jp2->w),4); /* WIDTH */
535 p_image_header_data += 4; 535 p_image_header_data += 4;
536 opj_read_bytes(p_image_header_data,&(jp2->numcomps),2); /* NC */ 536 opj_read_bytes(p_image_header_data,&(jp2->numcomps),2); /* NC */
537 p_image_header_data += 2; 537 p_image_header_data += 2;
538 538
539 /* allocate memory for components */ 539 /* allocate memory for components */
540 » jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp 2_comps_t)); 540 » jp2->comps = (opj_jp2_comps_t*) opj_calloc(jp2->numcomps, sizeof(opj_jp2 _comps_t));
541 if (jp2->comps == 0) { 541 if (jp2->comps == 0) {
542 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n"); 542 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle image header (ihdr)\n");
543 return OPJ_FALSE; 543 return OPJ_FALSE;
544 } 544 }
545 memset(jp2->comps,0,jp2->numcomps * sizeof(opj_jp2_comps_t));
546 545
547 opj_read_bytes(p_image_header_data,&(jp2->bpc),1); /* BPC */ 546 opj_read_bytes(p_image_header_data,&(jp2->bpc),1); /* BPC */
548 ++ p_image_header_data; 547 ++ p_image_header_data;
549 548
550 opj_read_bytes(p_image_header_data,&(jp2->C),1); /* C */ 549 opj_read_bytes(p_image_header_data,&(jp2->C),1); /* C */
551 ++ p_image_header_data; 550 ++ p_image_header_data;
552 551
553 /* Should be equal to 7 cf. chapter about image header box of the norm * / 552 /* Should be equal to 7 cf. chapter about image header box of the norm * /
554 if (jp2->C != 7){ 553 if (jp2->C != 7){
555 opj_event_msg(p_manager, EVT_INFO, "JP2 IHDR box: compression ty pe indicate that the file is not a conforming JP2 file (%d) \n", jp2->C); 554 opj_event_msg(p_manager, EVT_INFO, "JP2 IHDR box: compression ty pe indicate that the file is not a conforming JP2 file (%d) \n", jp2->C);
(...skipping 11 matching lines...) Expand all
567 OPJ_UINT32 * p_nb_bytes_written 566 OPJ_UINT32 * p_nb_bytes_written
568 ) 567 )
569 { 568 {
570 OPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr; 569 OPJ_BYTE * l_ihdr_data,* l_current_ihdr_ptr;
571 570
572 /* preconditions */ 571 /* preconditions */
573 assert(jp2 != 00); 572 assert(jp2 != 00);
574 assert(p_nb_bytes_written != 00); 573 assert(p_nb_bytes_written != 00);
575 574
576 /* default image header is 22 bytes wide */ 575 /* default image header is 22 bytes wide */
577 » l_ihdr_data = (OPJ_BYTE *) opj_malloc(22); 576 » l_ihdr_data = (OPJ_BYTE *) opj_calloc(1,22);
578 if (l_ihdr_data == 00) { 577 if (l_ihdr_data == 00) {
579 return 00; 578 return 00;
580 } 579 }
581 memset(l_ihdr_data,0,22);
582 580
583 l_current_ihdr_ptr = l_ihdr_data; 581 l_current_ihdr_ptr = l_ihdr_data;
584 582
585 opj_write_bytes(l_current_ihdr_ptr,22,4); /* write box size */ 583 opj_write_bytes(l_current_ihdr_ptr,22,4); /* write box size */
586 l_current_ihdr_ptr+=4; 584 l_current_ihdr_ptr+=4;
587 585
588 opj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4); /* IHDR */ 586 opj_write_bytes(l_current_ihdr_ptr,JP2_IHDR, 4); /* IHDR */
589 l_current_ihdr_ptr+=4; 587 l_current_ihdr_ptr+=4;
590 588
591 opj_write_bytes(l_current_ihdr_ptr,jp2->h, 4); /* HEIGHT */ 589 opj_write_bytes(l_current_ihdr_ptr,jp2->h, 4); /* HEIGHT */
(...skipping 28 matching lines...) Expand all
620 { 618 {
621 OPJ_UINT32 i; 619 OPJ_UINT32 i;
622 /* room for 8 bytes for box and 1 byte for each component */ 620 /* room for 8 bytes for box and 1 byte for each component */
623 OPJ_UINT32 l_bpcc_size = 8 + jp2->numcomps; 621 OPJ_UINT32 l_bpcc_size = 8 + jp2->numcomps;
624 OPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr; 622 OPJ_BYTE * l_bpcc_data,* l_current_bpcc_ptr;
625 623
626 /* preconditions */ 624 /* preconditions */
627 assert(jp2 != 00); 625 assert(jp2 != 00);
628 assert(p_nb_bytes_written != 00); 626 assert(p_nb_bytes_written != 00);
629 627
630 » l_bpcc_data = (OPJ_BYTE *) opj_malloc(l_bpcc_size); 628 » l_bpcc_data = (OPJ_BYTE *) opj_calloc(1,l_bpcc_size);
631 if (l_bpcc_data == 00) { 629 if (l_bpcc_data == 00) {
632 return 00; 630 return 00;
633 } 631 }
634 memset(l_bpcc_data,0,l_bpcc_size);
635 632
636 l_current_bpcc_ptr = l_bpcc_data; 633 l_current_bpcc_ptr = l_bpcc_data;
637 634
638 opj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4); /* write box size */ 635 opj_write_bytes(l_current_bpcc_ptr,l_bpcc_size,4); /* write box size */
639 l_current_bpcc_ptr += 4; 636 l_current_bpcc_ptr += 4;
640 637
641 opj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4); /* BPCC */ 638 opj_write_bytes(l_current_bpcc_ptr,JP2_BPCC,4); /* BPCC */
642 l_current_bpcc_ptr += 4; 639 l_current_bpcc_ptr += 4;
643 640
644 for (i = 0; i < jp2->numcomps; ++i) { 641 for (i = 0; i < jp2->numcomps; ++i) {
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 l_colr_size += 4; /* EnumCS */ 699 l_colr_size += 4; /* EnumCS */
703 break; 700 break;
704 case 2 : 701 case 2 :
705 assert(jp2->color.icc_profile_len); /* ICC profile */ 702 assert(jp2->color.icc_profile_len); /* ICC profile */
706 l_colr_size += jp2->color.icc_profile_len; 703 l_colr_size += jp2->color.icc_profile_len;
707 break; 704 break;
708 default : 705 default :
709 return 00; 706 return 00;
710 } 707 }
711 708
712 » l_colr_data = (OPJ_BYTE *) opj_malloc(l_colr_size); 709 » l_colr_data = (OPJ_BYTE *) opj_calloc(1,l_colr_size);
713 if (l_colr_data == 00) { 710 if (l_colr_data == 00) {
714 return 00; 711 return 00;
715 } 712 }
716 memset(l_colr_data,0,l_colr_size);
717 713
718 l_current_colr_ptr = l_colr_data; 714 l_current_colr_ptr = l_colr_data;
719 715
720 opj_write_bytes(l_current_colr_ptr,l_colr_size,4); /* write box size */ 716 opj_write_bytes(l_current_colr_ptr,l_colr_size,4); /* write box size */
721 l_current_colr_ptr += 4; 717 l_current_colr_ptr += 4;
722 718
723 opj_write_bytes(l_current_colr_ptr,JP2_COLR,4); /* BPCC */ 719 opj_write_bytes(l_current_colr_ptr,JP2_COLR,4); /* BPCC */
724 l_current_colr_ptr += 4; 720 l_current_colr_ptr += 4;
725 721
726 opj_write_bytes(l_current_colr_ptr, jp2->meth,1); /* METH */ 722 opj_write_bytes(l_current_colr_ptr, jp2->meth,1); /* METH */
(...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after
852 848
853 channel_size = color->jp2_pclr->channel_size; 849 channel_size = color->jp2_pclr->channel_size;
854 channel_sign = color->jp2_pclr->channel_sign; 850 channel_sign = color->jp2_pclr->channel_sign;
855 entries = color->jp2_pclr->entries; 851 entries = color->jp2_pclr->entries;
856 cmap = color->jp2_pclr->cmap; 852 cmap = color->jp2_pclr->cmap;
857 nr_channels = color->jp2_pclr->nr_channels; 853 nr_channels = color->jp2_pclr->nr_channels;
858 854
859 old_comps = image->comps; 855 old_comps = image->comps;
860 new_comps = (opj_image_comp_t*) 856 new_comps = (opj_image_comp_t*)
861 opj_malloc(nr_channels * sizeof(opj_image_comp_t)); 857 opj_malloc(nr_channels * sizeof(opj_image_comp_t));
862 858 » if (!new_comps) {
859 » » /* FIXME no error code for opj_jp2_apply_pclr */
860 » » /* FIXME event manager error callback */
861 » » return;
862 » }
863 for(i = 0; i < nr_channels; ++i) { 863 for(i = 0; i < nr_channels; ++i) {
864 pcol = cmap[i].pcol; cmp = cmap[i].cmp; 864 pcol = cmap[i].pcol; cmp = cmap[i].cmp;
865 865
866 /* Direct use */ 866 /* Direct use */
867 if(cmap[i].mtyp == 0){ 867 if(cmap[i].mtyp == 0){
868 assert( pcol == 0 ); 868 assert( pcol == 0 );
869 new_comps[i] = old_comps[cmp]; 869 new_comps[i] = old_comps[cmp];
870 } else { 870 } else {
871 assert( i == pcol ); 871 assert( i == pcol );
872 new_comps[pcol] = old_comps[cmp]; 872 new_comps[pcol] = old_comps[cmp];
873 } 873 }
874 874
875 /* Palette mapping: */ 875 /* Palette mapping: */
876 new_comps[i].data = (OPJ_INT32*) 876 new_comps[i].data = (OPJ_INT32*)
877 opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32)); 877 opj_malloc(old_comps[cmp].w * old_comps[cmp].h * sizeof(OPJ_INT32));
878 if (!new_comps[i].data) {
879 opj_free(new_comps);
880 new_comps = NULL;
881 /* FIXME no error code for opj_jp2_apply_pclr */
882 /* FIXME event manager error callback */
883 return;
884 }
878 new_comps[i].prec = channel_size[i]; 885 new_comps[i].prec = channel_size[i];
879 new_comps[i].sgnd = channel_sign[i]; 886 new_comps[i].sgnd = channel_sign[i];
880 } 887 }
881 888
882 top_k = color->jp2_pclr->nr_entries - 1; 889 top_k = color->jp2_pclr->nr_entries - 1;
883 890
884 for(i = 0; i < nr_channels; ++i) { 891 for(i = 0; i < nr_channels; ++i) {
885 /* Palette mapping: */ 892 /* Palette mapping: */
886 cmp = cmap[i].cmp; pcol = cmap[i].pcol; 893 cmp = cmap[i].cmp; pcol = cmap[i].pcol;
887 src = old_comps[cmp].data; 894 src = old_comps[cmp].data;
(...skipping 341 matching lines...) Expand 10 before | Expand all | Expand 10 after
1229 opj_read_bytes(p_colr_header_data,&jp2->meth ,1); /* METH */ 1236 opj_read_bytes(p_colr_header_data,&jp2->meth ,1); /* METH */
1230 ++p_colr_header_data; 1237 ++p_colr_header_data;
1231 1238
1232 opj_read_bytes(p_colr_header_data,&jp2->precedence ,1); /* PRECE DENCE */ 1239 opj_read_bytes(p_colr_header_data,&jp2->precedence ,1); /* PRECE DENCE */
1233 ++p_colr_header_data; 1240 ++p_colr_header_data;
1234 1241
1235 opj_read_bytes(p_colr_header_data,&jp2->approx ,1); /* APPROX */ 1242 opj_read_bytes(p_colr_header_data,&jp2->approx ,1); /* APPROX */
1236 ++p_colr_header_data; 1243 ++p_colr_header_data;
1237 1244
1238 if (jp2->meth == 1) { 1245 if (jp2->meth == 1) {
1246 if (p_colr_header_size < 7) {
1247 opj_event_msg(p_manager, EVT_ERROR, "Bad COLR header box (bad size: %d)\n", p_colr_header_size);
1248 return OPJ_FALSE;
1249 }
1239 if (p_colr_header_size > 7) { 1250 if (p_colr_header_size > 7) {
1240 /* testcase Altona_Technical_v20_x4.pdf */ 1251 /* testcase Altona_Technical_v20_x4.pdf */
1241 opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header b ox (bad size: %d)\n", p_colr_header_size); 1252 opj_event_msg(p_manager, EVT_WARNING, "Bad COLR header b ox (bad size: %d)\n", p_colr_header_size);
1242 } 1253 }
1243 1254
1244 opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4); /* EnumCS */ 1255 opj_read_bytes(p_colr_header_data,&jp2->enumcs ,4); /* EnumCS */
1245 1256
1246 p_colr_header_data += 4;
1247
1248 if(jp2->enumcs == 14)/* CIELab */
1249 {
1250 OPJ_UINT32 *cielab;
1251 OPJ_UINT32 rl, ol, ra, oa, rb, ob, il;
1252
1253 cielab = (OPJ_UINT32*)opj_malloc(9 * sizeof(OPJ_UINT32)) ;
1254 cielab[0] = 14; /* enumcs */
1255
1256 if(p_colr_header_size == 7)/* default values */
1257 {
1258 rl = ra = rb = ol = oa = ob = 0;
1259 il = 0x00443530; /* D50 */
1260 cielab[1] = 0x44454600;/* DEF */
1261 }
1262 else if(p_colr_header_size == 35)
1263 {
1264 opj_read_bytes(p_colr_header_data, &rl, 4);
1265 p_colr_header_data += 4;
1266 opj_read_bytes(p_colr_header_data, &ol, 4);
1267 p_colr_header_data += 4;
1268 opj_read_bytes(p_colr_header_data, &ra, 4);
1269 p_colr_header_data += 4;
1270 opj_read_bytes(p_colr_header_data, &oa, 4);
1271 p_colr_header_data += 4;
1272 opj_read_bytes(p_colr_header_data, &rb, 4);
1273 p_colr_header_data += 4;
1274 opj_read_bytes(p_colr_header_data, &ob, 4);
1275 p_colr_header_data += 4;
1276 opj_read_bytes(p_colr_header_data, &il, 4);
1277 p_colr_header_data += 4;
1278 cielab[1] = 0;
1279 }
1280 cielab[2] = rl; cielab[4] = ra; cielab[6] = rb;
1281 cielab[3] = ol; cielab[5] = oa; cielab[7] = ob;
1282 cielab[8] = il;
1283
1284 jp2->color.icc_profile_buf = (unsigned char*)cielab;
1285 jp2->color.icc_profile_len = 0;
1286 }
1287
1288 jp2->color.jp2_has_colr = 1; 1257 jp2->color.jp2_has_colr = 1;
1289 } 1258 }
1290 else if (jp2->meth == 2) { 1259 else if (jp2->meth == 2) {
1291 /* ICC profile */ 1260 /* ICC profile */
1292 OPJ_INT32 it_icc_value = 0; 1261 OPJ_INT32 it_icc_value = 0;
1293 OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3; 1262 OPJ_INT32 icc_len = (OPJ_INT32)p_colr_header_size - 3;
1294 1263
1295 jp2->color.icc_profile_len = (OPJ_UINT32)icc_len; 1264 jp2->color.icc_profile_len = (OPJ_UINT32)icc_len;
1296 » » jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_malloc((size_t)icc_ len); 1265 » » jp2->color.icc_profile_buf = (OPJ_BYTE*) opj_calloc(1,(size_t)ic c_len);
1297 if (!jp2->color.icc_profile_buf) 1266 if (!jp2->color.icc_profile_buf)
1298 { 1267 {
1299 jp2->color.icc_profile_len = 0; 1268 jp2->color.icc_profile_len = 0;
1300 return OPJ_FALSE; 1269 return OPJ_FALSE;
1301 } 1270 }
1302 memset(jp2->color.icc_profile_buf, 0, (size_t)icc_len * sizeof(O PJ_BYTE));
1303 1271
1304 for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value) 1272 for (it_icc_value = 0; it_icc_value < icc_len; ++it_icc_value)
1305 { 1273 {
1306 opj_read_bytes(p_colr_header_data,&l_value,1); /* icc values */ 1274 opj_read_bytes(p_colr_header_data,&l_value,1); /* icc values */
1307 ++p_colr_header_data; 1275 ++p_colr_header_data;
1308 jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_ value; 1276 jp2->color.icc_profile_buf[it_icc_value] = (OPJ_BYTE) l_ value;
1309 } 1277 }
1310 1278
1311 jp2->color.jp2_has_colr = 1; 1279 jp2->color.jp2_has_colr = 1;
1312 } 1280 }
1313 else if (jp2->meth > 2) 1281 else if (jp2->meth > 2)
1314 { 1282 {
1315 /*» ISO/IEC 15444-1:2004 (E), Table I.9 ?Legal METH values: 1283 /*» ISO/IEC 15444-1:2004 (E), Table I.9 ­ Legal METH values:
1316 conforming JP2 reader shall ignore the entire Colour Specification box.* / 1284 conforming JP2 reader shall ignore the entire Colour Specification box.* /
1317 opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), " 1285 opj_event_msg(p_manager, EVT_INFO, "COLR BOX meth value is not a regular value (%d), "
1318 "so we will ignore the entire Colour Specification box. \n", jp2->me th); 1286 "so we will ignore the entire Colour Specification box. \n", jp2->me th);
1319 } 1287 }
1320 return OPJ_TRUE; 1288 return OPJ_TRUE;
1321 } 1289 }
1322 1290
1323 OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2, 1291 OPJ_BOOL opj_jp2_decode(opj_jp2_t *jp2,
1324 opj_stream_private_t *p_stream, 1292 opj_stream_private_t *p_stream,
1325 opj_image_t* p_image, 1293 opj_image_t* p_image,
(...skipping 28 matching lines...) Expand all
1354 /* Apply the color space if needed */ 1322 /* Apply the color space if needed */
1355 if(jp2->color.jp2_cdef) { 1323 if(jp2->color.jp2_cdef) {
1356 opj_jp2_apply_cdef(p_image, &(jp2->color)); 1324 opj_jp2_apply_cdef(p_image, &(jp2->color));
1357 } 1325 }
1358 1326
1359 if(jp2->color.jp2_pclr) { 1327 if(jp2->color.jp2_pclr) {
1360 /* Part 1, I.5.3.4: Either both or none : */ 1328 /* Part 1, I.5.3.4: Either both or none : */
1361 if( !jp2->color.jp2_pclr->cmap) 1329 if( !jp2->color.jp2_pclr->cmap)
1362 opj_jp2_free_pclr(&(jp2->color)); 1330 opj_jp2_free_pclr(&(jp2->color));
1363 else 1331 else
1364 if(!p_image->useColorSpace)
1365 opj_jp2_apply_pclr(p_image, &(jp2->color)); 1332 opj_jp2_apply_pclr(p_image, &(jp2->color));
1366 } 1333 }
1367 1334
1368 if(jp2->color.icc_profile_buf) { 1335 if(jp2->color.icc_profile_buf) {
1369 p_image->icc_profile_buf = jp2->color.icc_profile_buf; 1336 p_image->icc_profile_buf = jp2->color.icc_profile_buf;
1370 p_image->icc_profile_len = jp2->color.icc_profile_len; 1337 p_image->icc_profile_len = jp2->color.icc_profile_len;
1371 jp2->color.icc_profile_buf = NULL; 1338 jp2->color.icc_profile_buf = NULL;
1372 } 1339 }
1373 } 1340 }
1374 1341
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
1480 OPJ_UINT32 i; 1447 OPJ_UINT32 i;
1481 OPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl; 1448 OPJ_UINT32 l_ftyp_size = 16 + 4 * jp2->numcl;
1482 OPJ_BYTE * l_ftyp_data, * l_current_data_ptr; 1449 OPJ_BYTE * l_ftyp_data, * l_current_data_ptr;
1483 OPJ_BOOL l_result; 1450 OPJ_BOOL l_result;
1484 1451
1485 /* preconditions */ 1452 /* preconditions */
1486 assert(cio != 00); 1453 assert(cio != 00);
1487 assert(jp2 != 00); 1454 assert(jp2 != 00);
1488 assert(p_manager != 00); 1455 assert(p_manager != 00);
1489 1456
1490 » l_ftyp_data = (OPJ_BYTE *) opj_malloc(l_ftyp_size); 1457 » l_ftyp_data = (OPJ_BYTE *) opj_calloc(1,l_ftyp_size);
1491 1458
1492 if (l_ftyp_data == 00) { 1459 if (l_ftyp_data == 00) {
1493 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n"); 1460 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle ftyp data\n");
1494 return OPJ_FALSE; 1461 return OPJ_FALSE;
1495 } 1462 }
1496 1463
1497 memset(l_ftyp_data,0,l_ftyp_size);
1498
1499 l_current_data_ptr = l_ftyp_data; 1464 l_current_data_ptr = l_ftyp_data;
1500 1465
1501 opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */ 1466 opj_write_bytes(l_current_data_ptr, l_ftyp_size,4); /* box size */
1502 l_current_data_ptr += 4; 1467 l_current_data_ptr += 4;
1503 1468
1504 opj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */ 1469 opj_write_bytes(l_current_data_ptr, JP2_FTYP,4); /* FTYP */
1505 l_current_data_ptr += 4; 1470 l_current_data_ptr += 4;
1506 1471
1507 opj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */ 1472 opj_write_bytes(l_current_data_ptr, jp2->brand,4); /* BR */
1508 l_current_data_ptr += 4; 1473 l_current_data_ptr += 4;
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
1599 1564
1600 /* further JP2 initializations go here */ 1565 /* further JP2 initializations go here */
1601 jp2->color.jp2_has_colr = 0; 1566 jp2->color.jp2_has_colr = 0;
1602 jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR _CMAP_CDEF_FLAG; 1567 jp2->ignore_pclr_cmap_cdef = parameters->flags & OPJ_DPARAMETERS_IGNORE_PCLR _CMAP_CDEF_FLAG;
1603 } 1568 }
1604 1569
1605 /* ----------------------------------------------------------------------- */ 1570 /* ----------------------------------------------------------------------- */
1606 /* JP2 encoder interface */ 1571 /* JP2 encoder interface */
1607 /* ----------------------------------------------------------------------- */ 1572 /* ----------------------------------------------------------------------- */
1608 1573
1609 void opj_jp2_setup_encoder(» opj_jp2_t *jp2, 1574 OPJ_BOOL opj_jp2_setup_encoder(»opj_jp2_t *jp2,
1610 opj_cparameters_t *parameters, 1575 opj_cparameters_t *parameters,
1611 opj_image_t *image, 1576 opj_image_t *image,
1612 opj_event_mgr_t * p_manager) 1577 opj_event_mgr_t * p_manager)
1613 { 1578 {
1614 OPJ_UINT32 i; 1579 OPJ_UINT32 i;
1615 OPJ_UINT32 depth_0; 1580 OPJ_UINT32 depth_0;
1616 OPJ_UINT32 sign; 1581 OPJ_UINT32 sign;
1617 1582
1618 if(!jp2 || !parameters || !image) 1583 if(!jp2 || !parameters || !image)
1619 » » return; 1584 » » return OPJ_FALSE;
1620 1585
1621 /* setup the J2K codec */ 1586 /* setup the J2K codec */
1622 /* ------------------- */ 1587 /* ------------------- */
1623 1588
1624 /* Check if number of components respects standard */ 1589 /* Check if number of components respects standard */
1625 if (image->numcomps < 1 || image->numcomps > 16384) { 1590 if (image->numcomps < 1 || image->numcomps > 16384) {
1626 opj_event_msg(p_manager, EVT_ERROR, "Invalid number of component s specified while setting up JP2 encoder\n"); 1591 opj_event_msg(p_manager, EVT_ERROR, "Invalid number of component s specified while setting up JP2 encoder\n");
1627 » » return; 1592 » » return OPJ_FALSE;
1628 } 1593 }
1629 1594
1630 » opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager ); 1595 » if (opj_j2k_setup_encoder(jp2->j2k, parameters, image, p_manager ) == OP J_FALSE) {
1596 » » return OPJ_FALSE;
1597 » }
1631 1598
1632 /* setup the JP2 codec */ 1599 /* setup the JP2 codec */
1633 /* ------------------- */ 1600 /* ------------------- */
1634 1601
1635 /* Profile box */ 1602 /* Profile box */
1636 1603
1637 jp2->brand = JP2_JP2; /* BR */ 1604 jp2->brand = JP2_JP2; /* BR */
1638 jp2->minversion = 0; /* MinV */ 1605 jp2->minversion = 0; /* MinV */
1639 jp2->numcl = 1; 1606 jp2->numcl = 1;
1640 jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32)); 1607 jp2->cl = (OPJ_UINT32*) opj_malloc(jp2->numcl * sizeof(OPJ_UINT32));
1641 if (!jp2->cl){ 1608 » if (!jp2->cl){
1642 jp2->cl = NULL; 1609 » » jp2->cl = NULL;
1643 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP 2 encoder\n"); 1610 » » opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setu p the JP2 encoder\n");
1644 return; 1611 » » return OPJ_FALSE;
1645 } 1612 » }
1646 jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */ 1613 jp2->cl[0] = JP2_JP2; /* CL0 : JP2 */
1647 1614
1648 /* Image Header box */ 1615 /* Image Header box */
1649 1616
1650 jp2->numcomps = image->numcomps; /* NC */ 1617 jp2->numcomps = image->numcomps; /* NC */
1651 jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp 2_comps_t)); 1618 jp2->comps = (opj_jp2_comps_t*) opj_malloc(jp2->numcomps * sizeof(opj_jp 2_comps_t));
1652 if (!jp2->comps) { 1619 » if (!jp2->comps) {
1653 jp2->comps = NULL; 1620 » » jp2->comps = NULL;
1654 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setup the JP 2 encoder\n"); 1621 » » opj_event_msg(p_manager, EVT_ERROR, "Not enough memory when setu p the JP2 encoder\n");
1655 return; 1622 » » /* Memory of jp2->cl will be freed by opj_jp2_destroy */
1656 } 1623 » » return OPJ_FALSE;
1624 » }
1657 1625
1658 jp2->h = image->y1 - image->y0; /* HEIGHT */ 1626 jp2->h = image->y1 - image->y0; /* HEIGHT */
1659 jp2->w = image->x1 - image->x0; /* WIDTH */ 1627 jp2->w = image->x1 - image->x0; /* WIDTH */
1660 /* BPC */ 1628 /* BPC */
1661 depth_0 = image->comps[0].prec - 1; 1629 depth_0 = image->comps[0].prec - 1;
1662 sign = image->comps[0].sgnd; 1630 sign = image->comps[0].sgnd;
1663 jp2->bpc = depth_0 + (sign << 7); 1631 jp2->bpc = depth_0 + (sign << 7);
1664 for (i = 1; i < image->numcomps; i++) { 1632 for (i = 1; i < image->numcomps; i++) {
1665 OPJ_UINT32 depth = image->comps[i].prec - 1; 1633 OPJ_UINT32 depth = image->comps[i].prec - 1;
1666 sign = image->comps[i].sgnd; 1634 sign = image->comps[i].sgnd;
(...skipping 22 matching lines...) Expand all
1689 jp2->enumcs = 17; /* greyscale */ 1657 jp2->enumcs = 17; /* greyscale */
1690 else if (image->color_space == 3) 1658 else if (image->color_space == 3)
1691 jp2->enumcs = 18; /* YUV */ 1659 jp2->enumcs = 18; /* YUV */
1692 } 1660 }
1693 1661
1694 1662
1695 jp2->precedence = 0; /* PRECEDENCE */ 1663 jp2->precedence = 0; /* PRECEDENCE */
1696 jp2->approx = 0; /* APPROX */ 1664 jp2->approx = 0; /* APPROX */
1697 1665
1698 jp2->jpip_on = parameters->jpip_on; 1666 jp2->jpip_on = parameters->jpip_on;
1667
1668 return OPJ_TRUE;
1699 } 1669 }
1700 1670
1701 OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2, 1671 OPJ_BOOL opj_jp2_encode(opj_jp2_t *jp2,
1702 opj_stream_private_t *stream, 1672 opj_stream_private_t *stream,
1703 opj_event_mgr_t * p_manager) 1673 opj_event_mgr_t * p_manager)
1704 { 1674 {
1705 return opj_j2k_encode(jp2->j2k, stream, p_manager); 1675 return opj_j2k_encode(jp2->j2k, stream, p_manager);
1706 } 1676 }
1707 1677
1708 OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2, 1678 OPJ_BOOL opj_jp2_end_decompress(opj_jp2_t *jp2,
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
1839 const opj_jp2_header_handler_t * l_current_handler; 1809 const opj_jp2_header_handler_t * l_current_handler;
1840 OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE; 1810 OPJ_UINT32 l_last_data_size = OPJ_BOX_SIZE;
1841 OPJ_UINT32 l_current_data_size; 1811 OPJ_UINT32 l_current_data_size;
1842 OPJ_BYTE * l_current_data = 00; 1812 OPJ_BYTE * l_current_data = 00;
1843 1813
1844 /* preconditions */ 1814 /* preconditions */
1845 assert(stream != 00); 1815 assert(stream != 00);
1846 assert(jp2 != 00); 1816 assert(jp2 != 00);
1847 assert(p_manager != 00); 1817 assert(p_manager != 00);
1848 1818
1849 » l_current_data = (OPJ_BYTE*)opj_malloc(l_last_data_size); 1819 » l_current_data = (OPJ_BYTE*)opj_calloc(1,l_last_data_size);
1850 1820
1851 if (l_current_data == 00) { 1821 if (l_current_data == 00) {
1852 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n"); 1822 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory to handle jpeg2000 file header\n");
1853 return OPJ_FALSE; 1823 return OPJ_FALSE;
1854 } 1824 }
1855 memset(l_current_data, 0 , l_last_data_size);
1856 1825
1857 while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) { 1826 while (opj_jp2_read_boxhdr(&box,&l_nb_bytes_read,stream,p_manager)) {
1858 /* is it the codestream box ? */ 1827 /* is it the codestream box ? */
1859 if (box.type == JP2_JP2C) { 1828 if (box.type == JP2_JP2C) {
1860 if (jp2->jp2_state & JP2_STATE_HEADER) { 1829 if (jp2->jp2_state & JP2_STATE_HEADER) {
1861 jp2->jp2_state |= JP2_STATE_CODESTREAM; 1830 jp2->jp2_state |= JP2_STATE_CODESTREAM;
1862 opj_free(l_current_data); 1831 opj_free(l_current_data);
1863 return OPJ_TRUE; 1832 return OPJ_TRUE;
1864 } 1833 }
1865 else { 1834 else {
1866 opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n"); 1835 opj_event_msg(p_manager, EVT_ERROR, "bad placed jpeg codestream\n");
1867 opj_free(l_current_data); 1836 opj_free(l_current_data);
1868 return OPJ_FALSE; 1837 return OPJ_FALSE;
1869 } 1838 }
1870 } 1839 }
1871 else if (box.length == 0) { 1840 else if (box.length == 0) {
1872 opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box o f undefined sizes\n"); 1841 opj_event_msg(p_manager, EVT_ERROR, "Cannot handle box o f undefined sizes\n");
1873 opj_free(l_current_data); 1842 opj_free(l_current_data);
1874 return OPJ_FALSE; 1843 return OPJ_FALSE;
1875 } 1844 }
1876 /* testcase 1851.pdf.SIGSEGV.ce9.948 */ 1845 /* testcase 1851.pdf.SIGSEGV.ce9.948 */
1877 » » /* testcase K-5787457125613568 */ 1846 » » else if»(box.length < l_nb_bytes_read) {
1878 » » else if»(box.length < l_nb_bytes_read || box.length > opj_stream _get_number_byte_left(stream)) {
1879 opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length, box.type); 1847 opj_event_msg(p_manager, EVT_ERROR, "invalid box size %d (%x)\n", box.length, box.type);
1880 opj_free(l_current_data); 1848 opj_free(l_current_data);
1881 return OPJ_FALSE; 1849 return OPJ_FALSE;
1882 } 1850 }
1883 1851
1884 l_current_handler = opj_jp2_find_handler(box.type); 1852 l_current_handler = opj_jp2_find_handler(box.type);
1885 l_current_data_size = box.length - l_nb_bytes_read; 1853 l_current_data_size = box.length - l_nb_bytes_read;
1886 1854
1887 if (l_current_handler != 00) { 1855 if (l_current_handler != 00) {
1888 if (l_current_data_size > l_last_data_size) { 1856 if (l_current_data_size > l_last_data_size) {
(...skipping 227 matching lines...) Expand 10 before | Expand all | Expand 10 after
2116 2084
2117 /* the number of remaining bytes should be a multiple of 4 */ 2085 /* the number of remaining bytes should be a multiple of 4 */
2118 if ((l_remaining_bytes & 0x3) != 0) { 2086 if ((l_remaining_bytes & 0x3) != 0) {
2119 opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature B ox size\n"); 2087 opj_event_msg(p_manager, EVT_ERROR, "Error with FTYP signature B ox size\n");
2120 return OPJ_FALSE; 2088 return OPJ_FALSE;
2121 } 2089 }
2122 2090
2123 /* div by 4 */ 2091 /* div by 4 */
2124 jp2->numcl = l_remaining_bytes >> 2; 2092 jp2->numcl = l_remaining_bytes >> 2;
2125 if (jp2->numcl) { 2093 if (jp2->numcl) {
2126 » » jp2->cl = (OPJ_UINT32 *) opj_malloc(jp2->numcl * sizeof(OPJ_UINT 32)); 2094 » » jp2->cl = (OPJ_UINT32 *) opj_calloc(jp2->numcl, sizeof(OPJ_UINT3 2));
2127 if (jp2->cl == 00) { 2095 if (jp2->cl == 00) {
2128 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory w ith FTYP Box\n"); 2096 opj_event_msg(p_manager, EVT_ERROR, "Not enough memory w ith FTYP Box\n");
2129 return OPJ_FALSE; 2097 return OPJ_FALSE;
2130 } 2098 }
2131 memset(jp2->cl,0,jp2->numcl * sizeof(OPJ_UINT32));
2132 } 2099 }
2133 2100
2134 for (i = 0; i < jp2->numcl; ++i) 2101 for (i = 0; i < jp2->numcl; ++i)
2135 { 2102 {
2136 opj_read_bytes(p_header_data,&jp2->cl[i],4); /* CLi * / 2103 opj_read_bytes(p_header_data,&jp2->cl[i],4); /* CLi * /
2137 p_header_data += 4; 2104 p_header_data += 4;
2138 } 2105 }
2139 2106
2140 jp2->jp2_state |= JP2_STATE_FILE_TYPE; 2107 jp2->jp2_state |= JP2_STATE_FILE_TYPE;
2141 2108
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
2218 opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box\n"); 2185 opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box\n");
2219 return OPJ_FALSE; 2186 return OPJ_FALSE;
2220 } 2187 }
2221 2188
2222 if (box.length > p_header_size) { 2189 if (box.length > p_header_size) {
2223 opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: box length is inconsistent.\n"); 2190 opj_event_msg(p_manager, EVT_ERROR, "Stream error while reading JP2 Header box: box length is inconsistent.\n");
2224 return OPJ_FALSE; 2191 return OPJ_FALSE;
2225 } 2192 }
2226 2193
2227 l_current_handler = opj_jp2_img_find_handler(box.type); 2194 l_current_handler = opj_jp2_img_find_handler(box.type);
2228 //BUGID:0055999
2229 //test file: fuzz-signal_sigsegv_6b88de_1123_2509.pdf
2230 if (box.length < l_box_size) return OPJ_FALSE;
2231 l_current_data_size = box.length - l_box_size; 2195 l_current_data_size = box.length - l_box_size;
2232 p_header_data += l_box_size; 2196 p_header_data += l_box_size;
2233 2197
2234 if (l_current_handler != 00) { 2198 if (l_current_handler != 00) {
2235 if (! l_current_handler->handler(jp2,p_header_data,l_cur rent_data_size,p_manager)) { 2199 if (! l_current_handler->handler(jp2,p_header_data,l_cur rent_data_size,p_manager)) {
2236 return OPJ_FALSE; 2200 return OPJ_FALSE;
2237 } 2201 }
2238 } 2202 }
2239 else { 2203 else {
2240 jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN; 2204 jp2->jp2_img_state |= JP2_IMG_STATE_UNKNOWN;
(...skipping 326 matching lines...) Expand 10 before | Expand all | Expand 10 after
2567 2531
2568 return OPJ_TRUE; 2532 return OPJ_TRUE;
2569 } 2533 }
2570 2534
2571 /* ----------------------------------------------------------------------- */ 2535 /* ----------------------------------------------------------------------- */
2572 /* JP2 encoder interface */ 2536 /* JP2 encoder interface */
2573 /* ----------------------------------------------------------------------- */ 2537 /* ----------------------------------------------------------------------- */
2574 2538
2575 opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder) 2539 opj_jp2_t* opj_jp2_create(OPJ_BOOL p_is_decoder)
2576 { 2540 {
2577 » opj_jp2_t *jp2 = (opj_jp2_t*)opj_malloc(sizeof(opj_jp2_t)); 2541 » opj_jp2_t *jp2 = (opj_jp2_t*)opj_calloc(1,sizeof(opj_jp2_t));
2578 if (jp2) { 2542 if (jp2) {
2579 memset(jp2,0,sizeof(opj_jp2_t));
2580 2543
2581 /* create the J2K codec */ 2544 /* create the J2K codec */
2582 if (! p_is_decoder) { 2545 if (! p_is_decoder) {
2583 jp2->j2k = opj_j2k_create_compress(); 2546 jp2->j2k = opj_j2k_create_compress();
2584 } 2547 }
2585 else { 2548 else {
2586 jp2->j2k = opj_j2k_create_decompress(); 2549 jp2->j2k = opj_j2k_create_decompress();
2587 } 2550 }
2588 2551
2589 if (jp2->j2k == 00) { 2552 if (jp2->j2k == 00) {
(...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after
2816 len = opj_stream_tell(cio)-lenp; 2779 len = opj_stream_tell(cio)-lenp;
2817 opj_stream_skip(cio, lenp, p_manager); 2780 opj_stream_skip(cio, lenp, p_manager);
2818 opj_write_bytes(l_data_header,len,4);/* L */ 2781 opj_write_bytes(l_data_header,len,4);/* L */
2819 opj_stream_write_data(cio,l_data_header,4,p_manager); 2782 opj_stream_write_data(cio,l_data_header,4,p_manager);
2820 opj_stream_seek(cio, lenp+len,p_manager); 2783 opj_stream_seek(cio, lenp+len,p_manager);
2821 2784
2822 return len; 2785 return len;
2823 } 2786 }
2824 #endif 2787 #endif
2825 #endif /* USE_JPIP */ 2788 #endif /* USE_JPIP */
OLDNEW
« no previous file with comments | « core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/jp2.h ('k') | core/src/fxcodec/fx_libopenjpeg/libopenjpeg20/mct.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698