Commit c7e64434 authored by Tom Butterworth's avatar Tom Butterworth Committed by Michael Niedermayer

Support the Hap chunked frame format

Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 9837d3b0
......@@ -291,8 +291,8 @@ OBJS-$(CONFIG_H264_MMAL_DECODER) += mmaldec.o
OBJS-$(CONFIG_H264_VDA_DECODER) += vda_h264_dec.o
OBJS-$(CONFIG_H264_QSV_DECODER) += qsvdec_h264.o
OBJS-$(CONFIG_H264_QSV_ENCODER) += qsvenc_h264.o
OBJS-$(CONFIG_HAP_DECODER) += hapdec.o
OBJS-$(CONFIG_HAP_ENCODER) += hapenc.o
OBJS-$(CONFIG_HAP_DECODER) += hapdec.o hap.o
OBJS-$(CONFIG_HAP_ENCODER) += hapenc.o hap.o
OBJS-$(CONFIG_HEVC_DECODER) += hevc.o hevc_mvs.o hevc_ps.o hevc_sei.o \
hevc_cabac.o hevc_refs.o hevcpred.o \
hevcdsp.o hevc_filter.o hevc_parse.o hevc_data.o
......
/*
* Vidvox Hap utility functions
* Copyright (C) 2015 Tom Butterworth <bangnoise@gmail.com>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
/**
* @file
* Hap utilities
*/
#include "hap.h"
int ff_hap_set_chunk_count(HapContext *ctx, int count, int first_in_frame)
{
int ret = 0;
if (first_in_frame == 1 && ctx->chunk_count != count) {
int ret = av_reallocp_array(&ctx->chunks, count, sizeof(HapChunk));
if (ret == 0)
ret = av_reallocp_array(&ctx->chunk_results, count, sizeof(int));
if (ret < 0) {
ctx->chunk_count = 0;
} else {
ctx->chunk_count = count;
}
} else if (ctx->chunk_count != count) {
/* If this is not the first chunk count calculated for a frame and a
* different count has already been encountered, then reject the frame:
* each table in the Decode Instructions Container must describe the
* same number of chunks. */
ret = AVERROR_INVALIDDATA;
}
return ret;
}
av_cold void ff_hap_free_context(HapContext *ctx)
{
av_freep(&ctx->tex_buf);
av_freep(&ctx->chunks);
av_freep(&ctx->chunk_results);
}
/*
* Vidvox Hap
* Copyright (C) 2015 Vittorio Giovara <vittorio.giovara@gmail.com>
* Copyright (C) 2015 Tom Butterworth <bangnoise@gmail.com>
*
* This file is part of FFmpeg.
*
......@@ -41,20 +42,39 @@ enum HapCompressor {
HAP_COMP_COMPLEX = 0xC0,
};
enum HapSectionType {
HAP_ST_DECODE_INSTRUCTIONS = 0x01,
HAP_ST_COMPRESSOR_TABLE = 0x02,
HAP_ST_SIZE_TABLE = 0x03,
HAP_ST_OFFSET_TABLE = 0x04,
};
typedef struct HapChunk {
enum HapCompressor compressor;
int compressed_offset;
size_t compressed_size;
int uncompressed_offset;
size_t uncompressed_size;
} HapChunk;
typedef struct HapContext {
AVClass *class;
TextureDSPContext dxtc;
GetByteContext gbc;
int section_type; /* Header type */
enum HapTextureFormat opt_tex_fmt; /* Texture type (encoder only) */
int opt_chunk_count; /* User-requested chunk count (encoder only) */
int chunk_count;
HapChunk *chunks;
int *chunk_results; /* Results from threaded operations */
int tex_rat; /* Compression ratio */
const uint8_t *tex_data; /* Compressed texture */
uint8_t *tex_buf; /* Uncompressed texture */
uint8_t *tex_buf; /* Buffer for compressed texture */
size_t tex_size; /* Size of the compressed texture */
uint8_t *snappied; /* Buffer interacting with snappy */
size_t max_snappy; /* Maximum compressed size for snappy buffer */
int slice_size; /* Optimal slice size */
......@@ -63,4 +83,15 @@ typedef struct HapContext {
int (*tex_fun)(uint8_t *dst, ptrdiff_t stride, const uint8_t *block);
} HapContext;
/*
* Set the number of chunks in the frame. Returns 0 on success or an error if:
* - first_in_frame is 0 and the number of chunks has changed
* - any other error occurs
*/
int ff_hap_set_chunk_count(HapContext *ctx, int count, int first_in_frame);
/*
* Free resources associated with the context
*/
av_cold void ff_hap_free_context(HapContext *ctx);
#endif /* AVCODEC_HAP_H */
This diff is collapsed.
This diff is collapsed.
......@@ -177,6 +177,9 @@ fate-hap5: CMD = framecrc -i $(TARGET_SAMPLES)/hap/hap5.mov
FATE_HAP += fate-hapy
fate-hapy: CMD = framecrc -i $(TARGET_SAMPLES)/hap/hapy.mov
FATE_HAP += fate-hap-chunk
fate-hap-chunk: CMD = framecrc -i $(TARGET_SAMPLES)/hap/hapy-12-chunks.mov
FATE_SAMPLES_AVCONV-$(call DEMDEC, MOV, HAP) += $(FATE_HAP)
fate-hap: $(FATE_HAP)
......
#tb 0: 1/30
0, 0, 0, 1, 16384, 0x096d409e
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment