[ 
https://issues.apache.org/jira/browse/TS-4095?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15075649#comment-15075649
 ] 

ASF GitHub Bot commented on TS-4095:
------------------------------------

Github user bgaff commented on a diff in the pull request:

    https://github.com/apache/trafficserver/pull/393#discussion_r48644645
  
    --- Diff: plugins/experimental/webp_transform/compress.cc ---
    @@ -0,0 +1,198 @@
    +/** @file
    +
    +    ATSCPPAPI plugin to do webp transform.
    +
    +    @section license License
    +
    +    Licensed to the Apache Software Foundation (ASF) under one
    +    or more contributor license agreements.  See the NOTICE file
    +    distributed with this work for additional information
    +    regarding copyright ownership.  The ASF licenses this file
    +    to you under the Apache License, Version 2.0 (the
    +    "License"); you may not use this file except in compliance
    +    with the License.  You may obtain a copy of the License at
    +
    +    http://www.apache.org/licenses/LICENSE-2.0
    +
    +    Unless required by applicable law or agreed to in writing, software
    +    distributed under the License is distributed on an "AS IS" BASIS,
    +    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 
implied.
    +    See the License for the specific language governing permissions and
    +    limitations under the License.
    +*/
    +
    +#include <stdio.h>
    +#include <stdlib.h>
    +#include <string.h>
    +
    +
    +#include <sstream>
    +#include <atscppapi/Logger.h>
    +#include "compress.h"
    +#include "Common.h"
    +
    +#define MAGIC_SIZE 12;
    +using std::string;
    +using std::vector;
    +
    +
    +static int
    +StreamWriter(const uint8_t *data, size_t data_size, const WebPPicture 
*const pic)
    +{
    +  WebpTransform *webp_transform = static_cast<WebpTransform 
*>(pic->custom_ptr);
    +  webp_transform->writeImage(reinterpret_cast<const char *>(data), 
data_size);
    +  return data_size ? data_size : 1;
    +}
    +
    +const string WebpTransform::_errors[] = {
    +  "OK", "OUT_OF_MEMORY: Out of memory allocating objects", 
"BITSTREAM_OUT_OF_MEMORY: Out of memory re-allocating byte buffer",
    +  "NULL_PARAMETER: NULL parameter passed to function", 
"INVALID_CONFIGURATION: configuration is invalid",
    +  "BAD_DIMENSION: Bad picture dimension. Maximum width and height "
    +  "allowed is 16383 pixels.",
    +  "PARTITION0_OVERFLOW: Partition #0 is too big to fit 512k.\n"
    +  "To reduce the size of this partition, try using less segments "
    +  "with the -segments option, and eventually reduce the number of "
    +  "header bits using -partition_limit. More details are available "
    +  "in the manual (`man cwebp`)",
    +  "PARTITION_OVERFLOW: Partition is too big to fit 16M", "BAD_WRITE: 
Picture writer returned an I/O error",
    +  "FILE_TOO_BIG: File would be too big to fit in 4G", "USER_ABORT: 
encoding abort requested by user"};
    +
    +void
    +WebpTransform::_webpMemoryWriterClear()
    +{
    +  if (_writer.mem != NULL) {
    +    free(_writer.mem);
    +    _writer.mem = NULL;
    +    _writer.size = 0;
    +    _writer.max_size = 0;
    +  }
    +}
    +
    +
    +WebpTransform::InputFileFormat
    +WebpTransform::_getImageType(std::stringstream &input_img)
    +{
    +  InputFileFormat format = UNSUPPORTED;
    +  uint32_t magic1, magic2;
    +  uint8_t buf[12];
    +  input_img.read((char *)buf, 12);
    +  input_img.seekg(0, input_img.beg);
    +
    +  magic1 = ((uint32_t)buf[0] << 24) | (buf[1] << 16) | (buf[2] << 8) | 
buf[3];
    +  magic2 = ((uint32_t)buf[8] << 24) | (buf[9] << 16) | (buf[10] << 8) | 
buf[11];
    +  if (magic1 == 0x89504E47U) {
    +    format = PNG_;
    +  } else if (magic1 >= 0xFFD8FF00U && magic1 <= 0xFFD8FFFFU) {
    +    format = JPEG_;
    +  } else if (magic1 == 0x52494646 && magic2 == 0x57454250) {
    +    format = WEBP_;
    +  }
    +  return format;
    +}
    +
    +int
    +WebpTransform::_readImage(std::stringstream &input_img)
    +{
    +  int ok = 0;
    +
    +  if (_picture.width == 0 || _picture.height == 0) {
    +    // If no size specified, try to decode it as PNG/JPEG (as appropriate).
    +    const InputFileFormat format = _getImageType(input_img);
    +    if (format == PNG_) {
    +      if (!_png_dec.init(&input_img)) {
    +        _png_dec.finalize();
    +        return 0;
    +      }
    +      ok = _png_dec.readImage(&_picture, &_metadata);
    +    } else if (format == JPEG_) {
    +      if (!_jpeg_dec.init(&input_img)) {
    +        _jpeg_dec.finalize();
    +        return 0;
    +      }
    +      ok = _jpeg_dec.readImage(&_picture, &_metadata);
    +    } else if (format == WEBP_) {
    +      TS_DEBUG(TAG, "Already webp file. Nothing to be done.");
    +    }
    +  }
    +  if (!ok)
    +    TS_DEBUG(TAG, "Unsupported image format. Failed to read image.");
    +
    +  return ok;
    +}
    +
    +
    +void
    +WebpTransform::_allocExtraInfo()
    +{
    +  const int mb_w = (_picture.width + 15) / 16;
    +  const int mb_h = (_picture.height + 15) / 16;
    +  _picture.extra_info = (uint8_t *)malloc(mb_w * mb_h * 
sizeof(_picture.extra_info));
    --- End diff --
    
    I'll be honest, this looks extremely weird. You're using the extra_info 
structure to represent the number of bits per pixel AND then you're also using 
it as a pointer later, why not only use it as an opaque pointer and pass in 
bits per pixel as an argument to this method?


> New cppapi plugin for converting image formats to wepb
> ------------------------------------------------------
>
>                 Key: TS-4095
>                 URL: https://issues.apache.org/jira/browse/TS-4095
>             Project: Traffic Server
>          Issue Type: New Feature
>          Components: CPP API, Plugins
>            Reporter: Sandeep Davu
>            Assignee: Brian Geffon
>              Labels: review
>             Fix For: 6.2.0
>
>
> Support for png and jpeg only.  Webp is a format introduced by google and can 
> retain the quality of the image by reducing the image size.



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to