FFmpeg
libavcodec
hapqa_extract_bsf.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 "
avcodec.h
"
29
#include "
bsf.h
"
30
#include "
bytestream.h
"
31
#include "
hap.h
"
32
33
typedef
struct
HapqaExtractContext
{
34
const
AVClass
*
class
;
35
int
texture
;
/* index of the texture to keep (0 for rgb or 1 for alpha) */
36
}
HapqaExtractContext
;
37
38
static
int
check_texture
(
HapqaExtractContext
*
ctx
,
int
section_type) {
39
if
(((
ctx
->texture == 0)&&((section_type & 0x0F) == 0x0F)) ||
/* HapQ texture and rgb extract */
40
((
ctx
->texture == 1)&&((section_type & 0x0F) == 0x01)))
/* HapAlphaOnly texture and alpha extract */
41
{
42
return
1;
/* the texture is the one to keep */
43
}
else
{
44
return
0;
45
}
46
}
47
48
static
int
hapqa_extract
(
AVBSFContext
*bsf,
AVPacket
*
pkt
)
49
{
50
HapqaExtractContext
*
ctx
= bsf->
priv_data
;
51
GetByteContext
gbc;
52
int
section_size;
53
enum
HapSectionType
section_type;
54
int
start_section_size;
55
int
target_packet_size = 0;
56
int
ret
= 0;
57
58
ret
=
ff_bsf_get_packet_ref
(bsf,
pkt
);
59
if
(
ret
< 0)
60
return
ret
;
61
62
bytestream2_init
(&gbc,
pkt
->
data
,
pkt
->
size
);
63
ret
=
ff_hap_parse_section_header
(&gbc, §ion_size, §ion_type);
64
if
(
ret
!= 0)
65
goto
fail
;
66
67
if
((section_type & 0x0F) != 0x0D) {
68
av_log
(bsf,
AV_LOG_ERROR
,
"Invalid section type for HAPQA %#04x.\n"
, section_type & 0x0F);
69
ret
=
AVERROR_INVALIDDATA
;
70
goto
fail
;
71
}
72
73
start_section_size = 4;
74
75
bytestream2_seek
(&gbc, start_section_size, SEEK_SET);
/* go to start of the first texture */
76
77
ret
=
ff_hap_parse_section_header
(&gbc, §ion_size, §ion_type);
78
if
(
ret
!= 0)
79
goto
fail
;
80
81
target_packet_size = section_size + 4;
82
83
if
(
check_texture
(
ctx
, section_type) == 0) {
/* the texture is not the one to keep */
84
start_section_size += 4 + section_size;
85
bytestream2_seek
(&gbc, start_section_size, SEEK_SET);
/* go to start of the second texture */
86
ret
=
ff_hap_parse_section_header
(&gbc, §ion_size, §ion_type);
87
if
(
ret
!= 0)
88
goto
fail
;
89
90
target_packet_size = section_size + 4;
91
92
if
(
check_texture
(
ctx
, section_type) == 0){
/* the second texture is not the one to keep */
93
av_log
(bsf,
AV_LOG_ERROR
,
"No valid texture found.\n"
);
94
ret
=
AVERROR_INVALIDDATA
;
95
goto
fail
;
96
}
97
}
98
99
pkt
->
data
+= start_section_size;
100
pkt
->
size
= target_packet_size;
101
102
fail
:
103
if
(
ret
< 0)
104
av_packet_unref
(
pkt
);
105
return
ret
;
106
}
107
108
static
const
enum
AVCodecID
codec_ids
[] = {
109
AV_CODEC_ID_HAP
,
AV_CODEC_ID_NONE
,
110
};
111
112
#define OFFSET(x) offsetof(HapqaExtractContext, x)
113
#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_BSF_PARAM)
114
static
const
AVOption
options
[] = {
115
{
"texture"
,
"texture to keep"
,
OFFSET
(texture),
AV_OPT_TYPE_INT
, { .i64 = 0 }, 0, 1,
FLAGS
,
"texture"
},
116
{
"color"
,
"keep HapQ texture"
, 0,
AV_OPT_TYPE_CONST
, { .i64 = 0 }, 0, 0,
FLAGS
,
"texture"
},
117
{
"alpha"
,
"keep HapAlphaOnly texture"
, 0,
AV_OPT_TYPE_CONST
, { .i64 = 1 }, 0, 0,
FLAGS
,
"texture"
},
118
{
NULL
},
119
};
120
121
static
const
AVClass
hapqa_extract_class
= {
122
.
class_name
=
"hapqa_extract_bsf"
,
123
.item_name =
av_default_item_name
,
124
.option =
options
,
125
.version =
LIBAVUTIL_VERSION_INT
,
126
};
127
128
const
AVBitStreamFilter
ff_hapqa_extract_bsf
= {
129
.
name
=
"hapqa_extract"
,
130
.filter =
hapqa_extract
,
131
.priv_data_size =
sizeof
(
HapqaExtractContext
),
132
.priv_class = &
hapqa_extract_class
,
133
.
codec_ids
=
codec_ids
,
134
};
av_packet_unref
void av_packet_unref(AVPacket *pkt)
Wipe the packet.
Definition:
avpacket.c:599
GetByteContext
Definition:
bytestream.h:33
AVBitStreamFilter::name
const char * name
Definition:
avcodec.h:5813
HapqaExtractContext::texture
int texture
Definition:
hapqa_extract_bsf.c:35
bytestream2_seek
static av_always_inline int bytestream2_seek(GetByteContext *g, int offset, int whence)
Definition:
bytestream.h:208
AVPacket::data
uint8_t * data
Definition:
avcodec.h:1477
AVOption
AVOption.
Definition:
opt.h:246
ff_hap_parse_section_header
int ff_hap_parse_section_header(GetByteContext *gbc, int *section_size, enum HapSectionType *section_type)
Definition:
hap.c:57
AVBSFContext
The bitstream filter state.
Definition:
avcodec.h:5763
check_texture
static int check_texture(HapqaExtractContext *ctx, int section_type)
Definition:
hapqa_extract_bsf.c:38
bsf.h
fail
#define fail()
Definition:
checkasm.h:120
hap.h
codec_ids
static enum AVCodecID codec_ids[]
Definition:
hapqa_extract_bsf.c:108
hapqa_extract
static int hapqa_extract(AVBSFContext *bsf, AVPacket *pkt)
Definition:
hapqa_extract_bsf.c:48
AV_LOG_ERROR
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition:
log.h:176
options
static const AVOption options[]
Definition:
hapqa_extract_bsf.c:114
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:67
NULL
#define NULL
Definition:
coverity.c:32
OFFSET
#define OFFSET(x)
Definition:
hapqa_extract_bsf.c:112
av_default_item_name
const char * av_default_item_name(void *ptr)
Return the context name.
Definition:
log.c:191
AVCodecID
AVCodecID
Identify the syntax and semantics of the bitstream.
Definition:
avcodec.h:215
HapSectionType
HapSectionType
Definition:
hap.h:46
AVPacket::size
int size
Definition:
avcodec.h:1478
AV_CODEC_ID_NONE
@ AV_CODEC_ID_NONE
Definition:
avcodec.h:216
avcodec.h
AVBSFContext::priv_data
void * priv_data
Opaque filter-specific private data.
Definition:
avcodec.h:5784
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:72
AV_CODEC_ID_HAP
@ AV_CODEC_ID_HAP
Definition:
avcodec.h:407
FLAGS
#define FLAGS
Definition:
hapqa_extract_bsf.c:113
hapqa_extract_class
static const AVClass hapqa_extract_class
Definition:
hapqa_extract_bsf.c:121
pkt
static AVPacket pkt
Definition:
demuxing_decoding.c:54
AVBitStreamFilter
Definition:
avcodec.h:5812
AV_OPT_TYPE_INT
@ AV_OPT_TYPE_INT
Definition:
opt.h:223
ff_hapqa_extract_bsf
const AVBitStreamFilter ff_hapqa_extract_bsf
Definition:
hapqa_extract_bsf.c:128
AVPacket
This structure stores compressed data.
Definition:
avcodec.h:1454
bytestream.h
bytestream2_init
static av_always_inline void bytestream2_init(GetByteContext *g, const uint8_t *buf, int buf_size)
Definition:
bytestream.h:133
av_log
#define av_log(a,...)
Definition:
tableprint_vlc.h:28
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:239
AVERROR_INVALIDDATA
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition:
error.h:59
HapqaExtractContext
Definition:
hapqa_extract_bsf.c:33
AV_OPT_TYPE_CONST
@ AV_OPT_TYPE_CONST
Definition:
opt.h:232
Generated on Wed Aug 24 2022 21:26:42 for FFmpeg by
1.8.17