int main(int argc, char *argv[]) { Image *img1; Image *img2; int ret; // Create and read img1 = image_Create(); ret = image_Read(img1, argv[1]); if(ret) printf("%d\n", ret); img2 = image_Create_Alloc(img1->width, img1->height, img1->depth, img1->channel); // Smooth smooth(img1, img2); // Write ret = image_Write(img2, argv[2]); if(ret) printf("%d\n", ret); // Destroy image_Destroy(&img1); image_Destroy(&img2); return 0; }
/***************************************************************************** * DecodePacket: decodes an OggSpots packet. *****************************************************************************/ static picture_t* DecodePacket(decoder_t* p_dec, block_t* p_block) { decoder_sys_t* p_sys = p_dec->p_sys; uint32_t i_img_offset; picture_t* p_pic; if (p_block->i_buffer < 20) { msg_Dbg(p_dec, "Packet too short"); goto error; } /* Byte offset */ i_img_offset = GetDWLE(p_block->p_buffer); if (i_img_offset < 20) { msg_Dbg(p_dec, "Invalid byte offset"); goto error; } /* Image format */ if ( !memcmp(&p_block->p_buffer[4], "PNG", 3) ) { p_dec->fmt_in.video.i_chroma = VLC_CODEC_PNG; } else if ( !memcmp(&p_block->p_buffer[4], "JPEG", 4) ) { p_dec->fmt_in.video.i_chroma = VLC_CODEC_JPEG; } else { char psz_image_type[8+1]; strncpy(psz_image_type, (char*)&p_block->p_buffer[4], 8); psz_image_type[sizeof(psz_image_type)-1] = '\0'; msg_Dbg(p_dec, "Unsupported image format: %s", psz_image_type); goto error; } /* We currently ignore the rest of the header and let the image format * handle the details */ p_block->i_buffer -= i_img_offset; p_block->p_buffer += i_img_offset; p_pic = image_Read(p_sys->p_image, p_block, &p_dec->fmt_in, &p_dec->fmt_out.video); if (p_pic == NULL) { return NULL; } p_pic->b_force = true; p_dec->fmt_out.i_codec = p_dec->fmt_out.video.i_chroma; decoder_UpdateVideoFormat(p_dec); return p_pic; error: block_Release(p_block); return NULL; }
static block_t *Decode(demux_t *demux, video_format_t *fmt, vlc_fourcc_t chroma, block_t *data) { image_handler_t *handler = image_HandlerCreate(demux); if (!handler) { block_Release(data); return NULL; } video_format_t decoded; video_format_Init(&decoded, chroma); picture_t *image = image_Read(handler, data, fmt, &decoded); image_HandlerDelete(handler); if (!image) return NULL; video_format_Clean(fmt); *fmt = decoded; size_t size = 0; for (int i = 0; i < image->i_planes; i++) size += image->p[i].i_pitch * image->p[i].i_lines; data = block_Alloc(size); if (!data) { picture_Release(image); return NULL; } size_t offset = 0; for (int i = 0; i < image->i_planes; i++) { const plane_t *src = &image->p[i]; for (int y = 0; y < src->i_visible_lines; y++) { memcpy(&data->p_buffer[offset], &src->p_pixels[y * src->i_pitch], src->i_visible_pitch); offset += src->i_visible_pitch; } } picture_Release(image); return data; }
static int ParseImageAttachments( decoder_t *p_dec ) { decoder_sys_t *p_sys = p_dec->p_sys; input_attachment_t **pp_attachments; int i_attachments_cnt; int k = 0; if( VLC_SUCCESS != decoder_GetInputAttachments( p_dec, &pp_attachments, &i_attachments_cnt )) return VLC_EGENERIC; for( k = 0; k < i_attachments_cnt; k++ ) { input_attachment_t *p_attach = pp_attachments[k]; vlc_fourcc_t type = image_Mime2Fourcc( p_attach->psz_mime ); if( ( type != 0 ) && ( p_attach->i_data > 0 ) && ( p_attach->p_data != NULL ) ) { picture_t *p_pic = NULL; image_handler_t *p_image; p_image = image_HandlerCreate( p_dec ); if( p_image != NULL ) { block_t *p_block; p_block = block_Alloc( p_attach->i_data ); if( p_block != NULL ) { video_format_t fmt_in; video_format_t fmt_out; memcpy( p_block->p_buffer, p_attach->p_data, p_attach->i_data ); memset( &fmt_in, 0, sizeof( video_format_t)); memset( &fmt_out, 0, sizeof( video_format_t)); fmt_in.i_chroma = type; fmt_out.i_chroma = VLC_CODEC_YUVA; /* Find a suitable decoder module */ if( module_exists( "sdl_image" ) ) { /* ffmpeg thinks it can handle bmp properly but it can't (at least * not all of them), so use sdl_image if it is available */ var_Create( p_dec, "codec", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); var_SetString( p_dec, "codec", "sdl_image" ); } p_pic = image_Read( p_image, p_block, &fmt_in, &fmt_out ); var_Destroy( p_dec, "codec" ); } image_HandlerDelete( p_image ); } if( p_pic ) { image_attach_t *p_picture = malloc( sizeof(image_attach_t) ); if( p_picture ) { p_picture->psz_filename = strdup( p_attach->psz_name ); p_picture->p_pic = p_pic; TAB_APPEND( (image_attach_t **), p_sys->i_images, p_sys->pp_images, p_picture ); // sunqueen modify } } } vlc_input_attachment_Delete( pp_attachments[ k ] ); }