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: avpacket.c:427
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:522
AVOption
AVOption.
Definition: opt.h:346
ff_hap_parse_section_header
int ff_hap_parse_section_header(GetByteContext *gbc, int *section_size, enum HapSectionType *section_type)
Definition: hap.c:57
filter
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce then the filter should push the output frames on the output link immediately As an exception to the previous rule if the input frame is enough to produce several output frames then the filter needs output only at least one per link The additional frames can be left buffered in the filter
Definition: filter_design.txt:228
AVBSFContext
The bitstream filter state.
Definition: bsf.h:68
bsf.h
fail
#define fail()
Definition: checkasm.h:179
hap.h
FLAGS
#define FLAGS
Definition: hapqa_extract.c:115
pkt
AVPacket * pkt
Definition: movenc.c:59
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:180
ctx
AVFormatContext * ctx
Definition: movenc.c:48
LIBAVUTIL_VERSION_INT
#define LIBAVUTIL_VERSION_INT
Definition: version.h:85
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:66
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:523
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:71
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
Definition: opt.h:235
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:499
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
Definition: opt.h:244
ff_hapqa_extract_bsf
const FFBitStreamFilter ff_hapqa_extract_bsf
Definition: hapqa_extract.c:130