FFmpeg
hapqa_extract.c
Go to the documentation of this file.
1 /*
2  * HAPQA extract bitstream filter
3  * Copyright (c) 2017 Jokyo Images
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * HAPQA extract bitstream filter
25  * extract one of the two textures of the HAQA
26  */
27 
28 #include "bsf.h"
29 #include "bsf_internal.h"
30 #include "bytestream.h"
31 #include "hap.h"
32 
33 #include "libavutil/opt.h"
34 
35 typedef struct HapqaExtractContext {
36  const AVClass *class;
37  int texture;/* index of the texture to keep (0 for rgb or 1 for alpha) */
39 
40 static int check_texture(HapqaExtractContext *ctx, int section_type) {
41  if (((ctx->texture == 0)&&((section_type & 0x0F) == 0x0F)) || /* HapQ texture and rgb extract */
42  ((ctx->texture == 1)&&((section_type & 0x0F) == 0x01))) /* HapAlphaOnly texture and alpha extract */
43  {
44  return 1; /* the texture is the one to keep */
45  } else {
46  return 0;
47  }
48 }
49 
51 {
53  GetByteContext gbc;
54  int section_size;
55  enum HapSectionType section_type;
56  int start_section_size;
57  int target_packet_size = 0;
58  int ret = 0;
59 
61  if (ret < 0)
62  return ret;
63 
64  bytestream2_init(&gbc, pkt->data, pkt->size);
65  ret = ff_hap_parse_section_header(&gbc, &section_size, &section_type);
66  if (ret != 0)
67  goto fail;
68 
69  if ((section_type & 0x0F) != 0x0D) {
70  av_log(bsf, AV_LOG_ERROR, "Invalid section type for HAPQA %#04x.\n", section_type & 0x0F);
72  goto fail;
73  }
74 
75  start_section_size = 4;
76 
77  bytestream2_seek(&gbc, start_section_size, SEEK_SET);/* go to start of the first texture */
78 
79  ret = ff_hap_parse_section_header(&gbc, &section_size, &section_type);
80  if (ret != 0)
81  goto fail;
82 
83  target_packet_size = section_size + 4;
84 
85  if (check_texture(ctx, section_type) == 0) { /* the texture is not the one to keep */
86  start_section_size += 4 + section_size;
87  bytestream2_seek(&gbc, start_section_size, SEEK_SET);/* go to start of the second texture */
88  ret = ff_hap_parse_section_header(&gbc, &section_size, &section_type);
89  if (ret != 0)
90  goto fail;
91 
92  target_packet_size = section_size + 4;
93 
94  if (check_texture(ctx, section_type) == 0){ /* the second texture is not the one to keep */
95  av_log(bsf, AV_LOG_ERROR, "No valid texture found.\n");
97  goto fail;
98  }
99  }
100 
101  pkt->data += start_section_size;
102  pkt->size = target_packet_size;
103 
104 fail:
105  if (ret < 0)
107  return ret;
108 }
109 
110 static const enum AVCodecID codec_ids[] = {
112 };
113 
114 #define OFFSET(x) offsetof(HapqaExtractContext, x)
115 #define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_BSF_PARAM)
116 static const AVOption options[] = {
117  { "texture", "texture to keep", OFFSET(texture), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 1, FLAGS, .unit = "texture" },
118  { "color", "keep HapQ texture", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, .unit = "texture" },
119  { "alpha", "keep HapAlphaOnly texture", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, .unit = "texture" },
120  { NULL },
121 };
122 
123 static const AVClass hapqa_extract_class = {
124  .class_name = "hapqa_extract_bsf",
125  .item_name = av_default_item_name,
126  .option = options,
127  .version = LIBAVUTIL_VERSION_INT,
128 };
129 
131  .p.name = "hapqa_extract",
132  .p.codec_ids = codec_ids,
133  .p.priv_class = &hapqa_extract_class,
134  .priv_data_size = sizeof(HapqaExtractContext),
136 };
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition: packet.c:429
opt.h
bsf_internal.h
GetByteContext
Definition: bytestream.h:33
AVBitStreamFilter::name
const char * name
Definition: bsf.h:112
hapqa_extract
static int hapqa_extract(AVBSFContext *bsf, AVPacket *pkt)
Definition: hapqa_extract.c:50
HapqaExtractContext::texture
int texture
Definition: hapqa_extract.c:37
bytestream2_seek
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
Definition: bytestream.h:212
AVPacket::data
uint8_t * data
Definition: packet.h:539
AVOption
AVOption.
Definition: opt.h:429
ff_hap_parse_section_header
int ff_hap_parse_section_header(GetByteContext *gbc, int *section_size, enum HapSectionType *section_type)
Definition: hap.c:58
filter
void(* filter)(uint8_t *src, int stride, int qscale)
Definition: h263dsp.c:29
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
bsf.h
fail
#define fail()
Definition: checkasm.h:188
hap.h
FLAGS
#define FLAGS
Definition: hapqa_extract.c:115
pkt
AVPacket * pkt
Definition: movenc.c:60
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:209
ctx
AVFormatContext * ctx
Definition: movenc.c:49
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:75
NULL
#define NULL
Definition: coverity.c:32
FFBitStreamFilter
Definition: bsf_internal.h:27
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition: log.c:237
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition: codec_id.h:49
FFBitStreamFilter::p
AVBitStreamFilter p
The public AVBitStreamFilter.
Definition: bsf_internal.h:31
HapSectionType
HapSectionType
Definition: hap.h:45
AVPacket::size
int size
Definition: packet.h:540
OFFSET
#define OFFSET(x)
Definition: hapqa_extract.c:114
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition: codec_id.h:50
check_texture
static int check_texture(HapqaExtractContext *ctx, int section_type)
Definition: hapqa_extract.c:40
AVBSFContext::priv_data
void * priv_data
Opaque filter-specific private data.
Definition: bsf.h:83
ret
ret
Definition: filter_design.txt:187
AVClass::class_name
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:80
codec_ids
static enum AVCodecID codec_ids[]
Definition: hapqa_extract.c:110
AV_CODEC_ID_HAP
@ AV_CODEC_ID_HAP
Definition: codec_id.h:241
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Underlying C type is int.
Definition: opt.h:259
hapqa_extract_class
static const AVClass hapqa_extract_class
Definition: hapqa_extract.c:123
options
static const AVOption options[]
Definition: hapqa_extract.c:116
AVPacket
This structure stores compressed data.
Definition: packet.h:516
bytestream.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition: bytestream.h:137
av_log
#define av_log(a,...)
Definition: tableprint_vlc.h:27
ff_bsf_get_packet_ref
int ff_bsf_get_packet_ref(AVBSFContext *ctx, AVPacket *pkt)
Called by bitstream filters to get packet for filtering.
Definition: bsf.c:256
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:61
HapqaExtractContext
Definition: hapqa_extract.c:35
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Special option type for declaring named constants.
Definition: opt.h:299
ff_hapqa_extract_bsf
const FFBitStreamFilter ff_hapqa_extract_bsf
Definition: hapqa_extract.c:130