Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
F
ffmpeg
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Stefan Westerfeld
ffmpeg
Commits
6f9b4b3e
Commit
6f9b4b3e
authored
Feb 22, 2022
by
Michael Niedermayer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec: Add dv marker bsf
Signed-off-by:
Michael Niedermayer
<
michael@niedermayer.cc
>
parent
31c4c99f
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
170 additions
and
0 deletions
+170
-0
bitstream_filters.texi
doc/bitstream_filters.texi
+30
-0
Makefile
libavcodec/Makefile
+1
-0
bitstream_filters.c
libavcodec/bitstream_filters.c
+1
-0
dv_error_marker_bsf.c
libavcodec/dv_error_marker_bsf.c
+138
-0
No files found.
doc/bitstream_filters.texi
View file @
6f9b4b3e
...
...
@@ -132,6 +132,36 @@ the header stored in extradata to the key packets:
ffmpeg -i INPUT -map 0 -flags:v +global_header -c:v libx264 -bsf:v dump_extra out.ts
@end example
@section dv_error_marker
Blocks in DV which are marked as damaged are replaced by blocks of the specified color.
@table @option
@item color
The color to replace damaged blocks by
@item sta
A 16 bit mask which specifies which of the 16 possible error status values are
to be replaced by colored blocks. 0xFFFE is the default which replaces all non 0
error status values.
@table @samp
@item ok
No error, no concealment
@item err
Error, No concealment
@item res
Reserved
@item notok
Error or concealment
@item notres
Not reserved
@item Aa, Ba, Ca, Ab, Bb, Cb, A, B, C, a, b, erri, erru
The specific error status code
@end table
see page 44-46 or section 5.5 of
@url{http://web.archive.org/web/20060927044735/http://www.smpte.org/smpte_store/standards/pdf/s314m.pdf}
@end table
@section eac3_core
Extract the core from a E-AC-3 stream, dropping extra channels.
...
...
libavcodec/Makefile
View file @
6f9b4b3e
...
...
@@ -1163,6 +1163,7 @@ OBJS-$(CONFIG_AV1_FRAME_SPLIT_BSF) += av1_frame_split_bsf.o
OBJS-$(CONFIG_CHOMP_BSF)
+=
chomp_bsf.o
OBJS-$(CONFIG_DUMP_EXTRADATA_BSF)
+=
dump_extradata_bsf.o
OBJS-$(CONFIG_DCA_CORE_BSF)
+=
dca_core_bsf.o
OBJS-$(CONFIG_DV_ERROR_MARKER_BSF)
+=
dv_error_marker_bsf.o
OBJS-$(CONFIG_EAC3_CORE_BSF)
+=
eac3_core_bsf.o
OBJS-$(CONFIG_EXTRACT_EXTRADATA_BSF)
+=
extract_extradata_bsf.o
\
av1_parse.o
h2645_parse.o
...
...
libavcodec/bitstream_filters.c
View file @
6f9b4b3e
...
...
@@ -31,6 +31,7 @@ extern const AVBitStreamFilter ff_av1_metadata_bsf;
extern
const
AVBitStreamFilter
ff_chomp_bsf
;
extern
const
AVBitStreamFilter
ff_dump_extradata_bsf
;
extern
const
AVBitStreamFilter
ff_dca_core_bsf
;
extern
const
AVBitStreamFilter
ff_dv_error_marker_bsf
;
extern
const
AVBitStreamFilter
ff_eac3_core_bsf
;
extern
const
AVBitStreamFilter
ff_extract_extradata_bsf
;
extern
const
AVBitStreamFilter
ff_filter_units_bsf
;
...
...
libavcodec/dv_error_marker_bsf.c
0 → 100644
View file @
6f9b4b3e
/*
* Copyright (c) 2022 Michael Niedermayer
*
* 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
*/
#include "bsf.h"
#include "bsf_internal.h"
#include "libavutil/colorspace.h"
#include "libavutil/intreadwrite.h"
#include "libavutil/opt.h"
typedef
struct
DVErrorMarkerContext
{
const
AVClass
*
class
;
uint8_t
color_rgba
[
4
];
int
sta
;
uint8_t
marked_block
[
76
];
}
DVErrorMarkerContext
;
static
void
setdc
(
uint8_t
*
b
,
const
uint8_t
color_rgba
[
4
],
int
cblocks
,
int
y_step
,
int
v_step
,
int
u_step
)
{
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
b
[
0
]
=
RGB_TO_Y_JPEG
(
color_rgba
[
0
],
color_rgba
[
1
],
color_rgba
[
2
])
+
128
;
b
[
1
]
=
0x06
;
b
+=
y_step
;
}
for
(
int
i
=
0
;
i
<
cblocks
;
i
++
)
{
b
[
0
]
=
RGB_TO_V_JPEG
(
color_rgba
[
0
],
color_rgba
[
1
],
color_rgba
[
2
])
-
128
;
b
[
1
]
=
0x16
;
b
+=
v_step
;
}
for
(
int
i
=
0
;
i
<
cblocks
;
i
++
)
{
b
[
0
]
=
RGB_TO_U_JPEG
(
color_rgba
[
0
],
color_rgba
[
1
],
color_rgba
[
2
])
-
128
;
b
[
1
]
=
0x16
;
b
+=
u_step
;
}
}
static
int
dv_error_marker_init
(
AVBSFContext
*
ctx
)
{
DVErrorMarkerContext
*
s
=
ctx
->
priv_data
;
memset
(
s
->
marked_block
,
-
1
,
76
);
setdc
(
s
->
marked_block
,
s
->
color_rgba
,
1
,
14
,
10
,
10
);
setdc
(
s
->
marked_block
,
s
->
color_rgba
,
2
,
10
,
10
,
8
);
return
0
;
}
static
int
dv_error_marker_filter
(
AVBSFContext
*
ctx
,
AVPacket
*
pkt
)
{
DVErrorMarkerContext
*
s
=
ctx
->
priv_data
;
int
ret
=
ff_bsf_get_packet_ref
(
ctx
,
pkt
);
uint8_t
*
p
;
int
writable
=
0
;
int
stamask
=
s
->
sta
;
int
match_count
=
0
;
if
(
ret
<
0
)
return
ret
;
p
=
pkt
->
data
;
for
(
int
i
=
0
;
i
<
pkt
->
size
-
79
;
i
+=
80
)
{
// see page 44-46 or section 5.5 of http://web.archive.org/web/20060927044735/http://www.smpte.org/smpte_store/standards/pdf/s314m.pdf.
if
((
p
[
i
]
>>
4
)
==
9
&&
((
stamask
>>
(
p
[
i
+
3
]
>>
4
))
&
1
))
{
if
(
!
writable
)
{
ret
=
av_packet_make_writable
(
pkt
);
if
(
ret
<
0
)
{
av_packet_unref
(
pkt
);
return
ret
;
}
writable
=
1
;
p
=
pkt
->
data
;
}
memcpy
(
p
+
i
+
4
,
s
->
marked_block
,
76
);
match_count
++
;
}
}
av_log
(
ctx
,
AV_LOG_DEBUG
,
"%8"
PRId64
": Replaced %5d blocks by color %X
\n
"
,
pkt
->
pts
,
match_count
,
AV_RB32
(
s
->
color_rgba
));
return
0
;
}
#define OFFSET(x) offsetof(DVErrorMarkerContext, x)
#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM|AV_OPT_FLAG_BSF_PARAM)
static
const
AVOption
options
[]
=
{
{
"color"
,
"set color"
,
OFFSET
(
color_rgba
),
AV_OPT_TYPE_COLOR
,
{.
str
=
"yellow"
},
0
,
0
,
FLAGS
},
{
"sta"
,
"specify which error status value to match"
,
OFFSET
(
sta
),
AV_OPT_TYPE_FLAGS
,
{.
i64
=
0xFFFE
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"ok"
,
"No error, no concealment"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0001
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"Aa"
,
"No error, concealment from previous frame type a"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0004
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"Ba"
,
"No error, concealment from next frame type a"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0010
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"Ca"
,
"No error, unspecified concealment type a"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0040
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"erri"
,
"Error with inserted code, No concealment"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0080
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"erru"
,
"Error with unidentified pos, No concealment"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x8000
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"err"
,
"Error, No concealment"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x8080
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"Ab"
,
"No error, concealment from previous frame type b"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0400
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"Bb"
,
"No error, concealment from next frame type b"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x1000
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"Cb"
,
"No error, unspecified concealment type b"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x4000
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"A"
,
"No error, concealment from previous frame"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0404
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"B"
,
"No error, concealment from next frame"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x1010
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"C"
,
"No error, unspecified concealment"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x4040
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"a"
,
"No error, concealment type a"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x0054
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"b"
,
"No error, concealment type b"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x5400
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"res"
,
"Reserved"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0x2B2A
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"notok"
,
"Error or concealment"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0xD4D4
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
"notres"
,
"Not reserved"
,
0
,
AV_OPT_TYPE_CONST
,
{.
i64
=
0xD4D5
},
0
,
0xFFFF
,
FLAGS
,
"sta"
},
{
NULL
},
};
static
const
AVClass
dv_error_marker_class
=
{
.
class_name
=
"dv_error_marker"
,
.
item_name
=
av_default_item_name
,
.
option
=
options
,
.
version
=
LIBAVUTIL_VERSION_INT
,
};
const
AVBitStreamFilter
ff_dv_error_marker_bsf
=
{
.
name
=
"dv_error_marker"
,
.
priv_data_size
=
sizeof
(
DVErrorMarkerContext
),
.
priv_class
=
&
dv_error_marker_class
,
.
init
=
dv_error_marker_init
,
.
filter
=
dv_error_marker_filter
,
.
codec_ids
=
(
const
enum
AVCodecID
[]){
AV_CODEC_ID_DVVIDEO
,
AV_CODEC_ID_NONE
},
};
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment