/** * Delete the image_handler_t instance * */ void image_HandlerDelete( image_handler_t *p_image ) { if( !p_image ) return; if( p_image->p_dec ) DeleteDecoder( p_image->p_dec ); if( p_image->p_enc ) DeleteEncoder( p_image->p_enc ); if( p_image->p_filter ) DeleteFilter( p_image->p_filter ); free( p_image ); p_image = NULL; }
int WebPEncode(const WebPConfig* const config, WebPPicture* const pic) { VP8Encoder* enc; int ok; if (pic == NULL) return 0; WebPEncodingSetError(pic, VP8_ENC_OK); // all ok so far if (config == NULL) // bad params return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER); if (!WebPValidateConfig(config)) return WebPEncodingSetError(pic, VP8_ENC_ERROR_INVALID_CONFIGURATION); if (pic->width <= 0 || pic->height <= 0) return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION); if (pic->y == NULL || pic->u == NULL || pic->v == NULL) return WebPEncodingSetError(pic, VP8_ENC_ERROR_NULL_PARAMETER); if (pic->width > WEBP_MAX_DIMENSION || pic->height > WEBP_MAX_DIMENSION) return WebPEncodingSetError(pic, VP8_ENC_ERROR_BAD_DIMENSION); enc = InitEncoder(config, pic); if (enc == NULL) return 0; // pic->error is already set. // Note: each of the tasks below account for 20% in the progress report. ok = VP8EncAnalyze(enc) && VP8StatLoop(enc) && VP8EncLoop(enc) && VP8EncFinishAlpha(enc) #ifdef WEBP_EXPERIMENTAL_FEATURES && VP8EncFinishLayer(enc) #endif && VP8EncWrite(enc); StoreStats(enc); if (!ok) { VP8EncFreeBitWriters(enc); } DeleteEncoder(enc); return ok; }
static encoder_t *CreateEncoder( vlc_object_t *p_this, video_format_t *fmt_in, video_format_t *fmt_out ) { encoder_t *p_enc; p_enc = sout_EncoderCreate( p_this ); if( p_enc == NULL ) return NULL; p_enc->p_module = NULL; es_format_Init( &p_enc->fmt_in, VIDEO_ES, fmt_in->i_chroma ); p_enc->fmt_in.video = *fmt_in; if( p_enc->fmt_in.video.i_visible_width == 0 || p_enc->fmt_in.video.i_visible_height == 0 || p_enc->fmt_out.video.i_visible_width == 0 || p_enc->fmt_out.video.i_visible_height == 0 ) { if( fmt_out->i_width > 0 && fmt_out->i_height > 0 ) { p_enc->fmt_in.video.i_width = fmt_out->i_width; p_enc->fmt_in.video.i_height = fmt_out->i_height; if( fmt_out->i_visible_width > 0 && fmt_out->i_visible_height > 0 ) { p_enc->fmt_in.video.i_visible_width = fmt_out->i_visible_width; p_enc->fmt_in.video.i_visible_height = fmt_out->i_visible_height; } else { p_enc->fmt_in.video.i_visible_width = fmt_out->i_width; p_enc->fmt_in.video.i_visible_height = fmt_out->i_height; } } } else if( fmt_out->i_sar_num && fmt_out->i_sar_den && fmt_out->i_sar_num * fmt_in->i_sar_den != fmt_out->i_sar_den * fmt_in->i_sar_num ) { p_enc->fmt_in.video.i_width = fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den * fmt_in->i_width / fmt_in->i_sar_den / fmt_out->i_sar_num; p_enc->fmt_in.video.i_visible_width = fmt_in->i_sar_num * (int64_t)fmt_out->i_sar_den * fmt_in->i_visible_width / fmt_in->i_sar_den / fmt_out->i_sar_num; } p_enc->fmt_in.video.i_frame_rate = 25; p_enc->fmt_in.video.i_frame_rate_base = 1; es_format_Init( &p_enc->fmt_out, VIDEO_ES, fmt_out->i_chroma ); p_enc->fmt_out.video = *fmt_out; p_enc->fmt_out.video.i_width = p_enc->fmt_in.video.i_width; p_enc->fmt_out.video.i_height = p_enc->fmt_in.video.i_height; /* Find a suitable decoder module */ p_enc->p_module = module_need( p_enc, "encoder", NULL, false ); if( !p_enc->p_module ) { msg_Err( p_enc, "no suitable encoder module for fourcc `%4.4s'.\n" "VLC probably does not support this image format.", (char*)&p_enc->fmt_out.i_codec ); DeleteEncoder( p_enc ); return NULL; } p_enc->fmt_in.video.i_chroma = p_enc->fmt_in.i_codec; return p_enc; }
static block_t *ImageWrite( image_handler_t *p_image, picture_t *p_pic, video_format_t *p_fmt_in, video_format_t *p_fmt_out ) { block_t *p_block; /* Check if we can reuse the current encoder */ if( p_image->p_enc && ( p_image->p_enc->fmt_out.i_codec != p_fmt_out->i_chroma || p_image->p_enc->fmt_out.video.i_width != p_fmt_out->i_width || p_image->p_enc->fmt_out.video.i_height != p_fmt_out->i_height ) ) { DeleteEncoder( p_image->p_enc ); p_image->p_enc = 0; } /* Start an encoder */ if( !p_image->p_enc ) { p_image->p_enc = CreateEncoder( p_image->p_parent, p_fmt_in, p_fmt_out ); if( !p_image->p_enc ) return NULL; } /* Check if we need chroma conversion or resizing */ if( p_image->p_enc->fmt_in.video.i_chroma != p_fmt_in->i_chroma || p_image->p_enc->fmt_in.video.i_width != p_fmt_in->i_width || p_image->p_enc->fmt_in.video.i_height != p_fmt_in->i_height ) { picture_t *p_tmp_pic; if( p_image->p_filter ) if( p_image->p_filter->fmt_in.video.i_chroma != p_fmt_in->i_chroma || p_image->p_filter->fmt_out.video.i_chroma != p_image->p_enc->fmt_in.video.i_chroma ) { /* We need to restart a new filter */ DeleteFilter( p_image->p_filter ); p_image->p_filter = 0; } /* Start a filter */ if( !p_image->p_filter ) { es_format_t fmt_in; es_format_Init( &fmt_in, VIDEO_ES, p_fmt_in->i_chroma ); fmt_in.video = *p_fmt_in; p_image->p_filter = CreateFilter( p_image->p_parent, &fmt_in, &p_image->p_enc->fmt_in.video ); if( !p_image->p_filter ) { return NULL; } } else { /* Filters should handle on-the-fly size changes */ p_image->p_filter->fmt_in.i_codec = p_fmt_in->i_chroma; p_image->p_filter->fmt_out.video = *p_fmt_in; p_image->p_filter->fmt_out.i_codec =p_image->p_enc->fmt_in.i_codec; p_image->p_filter->fmt_out.video = p_image->p_enc->fmt_in.video; } picture_Hold( p_pic ); p_tmp_pic = p_image->p_filter->pf_video_filter( p_image->p_filter, p_pic ); if( likely(p_tmp_pic != NULL) ) { p_block = p_image->p_enc->pf_encode_video( p_image->p_enc, p_tmp_pic ); picture_Release( p_tmp_pic ); } else p_block = NULL; } else { p_block = p_image->p_enc->pf_encode_video( p_image->p_enc, p_pic ); } if( !p_block ) { msg_Dbg( p_image->p_parent, "no image encoded" ); return 0; } return p_block; }
/** * Free the resources associated with this encoder. * Delete the Encoder object and the entries from the cache for this encoder. * * @param aChannel The channel on the digital module for the A Channel of the encoder * @param bChannel The channel on the digital module for the B Channel of the encoder */ void DeleteEncoder(UINT32 aChannel, UINT32 bChannel) { DeleteEncoder(SensorBase::GetDefaultDigitalModule(), aChannel, SensorBase::GetDefaultDigitalModule(), bChannel); }