| 
																	
																	
																		
																	
																	
																 | 
																@@ -2094,6 +2094,52 @@ static int vp8_decode_update_thread_context(AVCodecContext *dst, const AVCodecCo | 
															
														
														
													
														
															
																 | 
																 | 
																    return 0; | 
																 | 
																 | 
																    return 0; | 
															
														
														
													
														
															
																 | 
																 | 
																} | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																
  | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static unsigned apply_padding(unsigned size) { return size + (size & 1); } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																static int webp_decode_frame(AVCodecContext *avctx, void *data, int *data_size, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																                             AVPacket *avpkt) | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																{ | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    const uint8_t *buf = avpkt->data; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    int buf_size       = avpkt->size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    AVPacket pkt       = *avpkt; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    if (buf_size >= 16 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        && AV_RL32(buf   ) == AV_RL32("RIFF") | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        && AV_RL32(buf+ 8) == AV_RL32("WEBP")) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        unsigned riff_size = apply_padding(AV_RL32(buf+4)) + 8; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        buf += 12;   // Skip over main header | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        buf_size -= 12; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (buf_size < 8 || riff_size < 8) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, "Incomplete header.\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            return AVERROR_INVALIDDATA; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (AV_RL32(buf) == AV_RL32("VP8L")) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_log(avctx, AV_LOG_ERROR, "Unsupported WebP lossless format.\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            return AVERROR_PATCHWELCOME; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (AV_RL32(buf) == AV_RL32("VP8X") && AV_RL32(buf+4) < (unsigned)buf_size) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            unsigned size = apply_padding(AV_RL32(buf+4) + 8); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf      += size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf_size -= size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (buf_size >= 8 | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            && AV_RL32(buf) == AV_RL32("ALPH") && AV_RL32(buf+4) < (unsigned)buf_size) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            unsigned size = apply_padding(AV_RL32(buf+4) + 8); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf      += size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf_size -= size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            av_log(avctx, AV_LOG_WARNING, "Skipping alpha plane\n"); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        if (buf_size >= 8 && AV_RL32(buf) == AV_RL32("VP8 ")) { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf      += 8; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																            buf_size -= 8; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																        } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    } | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    pkt.data = buf; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    pkt.size = buf_size; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    return vp8_decode_frame(avctx, data, data_size, &pkt); | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																} | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																AVCodec ff_vp8_decoder = { | 
																 | 
																 | 
																AVCodec ff_vp8_decoder = { | 
															
														
														
													
														
															
																 | 
																 | 
																    .name                  = "vp8", | 
																 | 
																 | 
																    .name                  = "vp8", | 
															
														
														
													
														
															
																 | 
																 | 
																    .type                  = AVMEDIA_TYPE_VIDEO, | 
																 | 
																 | 
																    .type                  = AVMEDIA_TYPE_VIDEO, | 
															
														
														
													
												
													
														
															
																| 
																	
																	
																	
																		
																	
																 | 
																@@ -2108,3 +2154,18 @@ AVCodec ff_vp8_decoder = { | 
															
														
														
													
														
															
																 | 
																 | 
																    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(vp8_decode_init_thread_copy), | 
																 | 
																 | 
																    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(vp8_decode_init_thread_copy), | 
															
														
														
													
														
															
																 | 
																 | 
																    .update_thread_context = ONLY_IF_THREADS_ENABLED(vp8_decode_update_thread_context), | 
																 | 
																 | 
																    .update_thread_context = ONLY_IF_THREADS_ENABLED(vp8_decode_update_thread_context), | 
															
														
														
													
														
															
																 | 
																 | 
																}; | 
																 | 
																 | 
																}; | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																
  | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																AVCodec ff_webp_decoder = { | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .name                  = "webp", | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .type                  = AVMEDIA_TYPE_VIDEO, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .id                    = AV_CODEC_ID_WEBP, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .priv_data_size        = sizeof(VP8Context), | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .init                  = vp8_decode_init, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .close                 = vp8_decode_free, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .decode                = webp_decode_frame, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .capabilities          = CODEC_CAP_DR1 | CODEC_CAP_FRAME_THREADS | CODEC_CAP_SLICE_THREADS, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .flush                 = vp8_decode_flush, | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .long_name             = NULL_IF_CONFIG_SMALL("WebP"), | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .init_thread_copy      = ONLY_IF_THREADS_ENABLED(vp8_decode_init_thread_copy), | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																    .update_thread_context = ONLY_IF_THREADS_ENABLED(vp8_decode_update_thread_context), | 
															
														
														
													
														
															
																 | 
																 | 
																 | 
																 | 
																 | 
																}; |