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
00994e8b
Commit
00994e8b
authored
Jan 31, 2023
by
Paul B Mahol
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
avcodec: add media100_to_mjpegb bitstream filter and use it
parent
fb823161
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
189 additions
and
2 deletions
+189
-2
Changelog
Changelog
+1
-0
configure
configure
+1
-0
Makefile
libavcodec/Makefile
+2
-1
bitstream_filters.c
libavcodec/bitstream_filters.c
+1
-0
media100_to_mjpegb_bsf.c
libavcodec/media100_to_mjpegb_bsf.c
+168
-0
mjpegbdec.c
libavcodec/mjpegbdec.c
+15
-0
version.h
libavcodec/version.h
+1
-1
No files found.
Changelog
View file @
00994e8b
...
...
@@ -35,6 +35,7 @@ version <next>:
- ffmpeg CLI new options: -enc_stats_pre[_fmt], -enc_stats_post[_fmt]
- hstack_vaapi, vstack_vaapi and xstack_vaapi filters
- XMD ADPCM decoder and demuxer
- media100 to mjpegb bsf
version 5.1:
...
...
configure
View file @
00994e8b
...
...
@@ -2850,6 +2850,7 @@ lscr_decoder_select="inflate_wrapper"
magicyuv_decoder_select
=
"llviddsp"
magicyuv_encoder_select
=
"llvidencdsp"
mdec_decoder_select
=
"blockdsp bswapdsp idctdsp"
media100_decoder_select
=
"media100_to_mjpegb_bsf mjpegb_decoder"
metasound_decoder_select
=
"lsp sinewin"
mimic_decoder_select
=
"blockdsp bswapdsp hpeldsp idctdsp"
mjpeg_decoder_select
=
"blockdsp hpeldsp exif idctdsp jpegtables"
...
...
libavcodec/Makefile
View file @
00994e8b
...
...
@@ -485,7 +485,7 @@ OBJS-$(CONFIG_MACE6_DECODER) += mace.o
OBJS-$(CONFIG_MAGICYUV_DECODER)
+=
magicyuv.o
OBJS-$(CONFIG_MAGICYUV_ENCODER)
+=
magicyuvenc.o
OBJS-$(CONFIG_MDEC_DECODER)
+=
mdec.o
mpeg12.o
mpeg12data.o
OBJS-$(CONFIG_MEDIA100_DECODER)
+=
m
edia100
.o
OBJS-$(CONFIG_MEDIA100_DECODER)
+=
m
jpegbdec
.o
OBJS-$(CONFIG_METASOUND_DECODER)
+=
metasound.o
twinvq.o
OBJS-$(CONFIG_MICRODVD_DECODER)
+=
microdvddec.o
ass.o
OBJS-$(CONFIG_MIMIC_DECODER)
+=
mimic.o
...
...
@@ -1220,6 +1220,7 @@ OBJS-$(CONFIG_HEVC_METADATA_BSF) += h265_metadata_bsf.o h265_profile_le
h2645data.o
OBJS-$(CONFIG_HEVC_MP4TOANNEXB_BSF)
+=
hevc_mp4toannexb_bsf.o
OBJS-$(CONFIG_IMX_DUMP_HEADER_BSF)
+=
imx_dump_header_bsf.o
OBJS-$(CONFIG_MEDIA100_TO_MJPEGB_BSF)
+=
media100_to_mjpegb_bsf.o
OBJS-$(CONFIG_MJPEG2JPEG_BSF)
+=
mjpeg2jpeg_bsf.o
OBJS-$(CONFIG_MJPEGA_DUMP_HEADER_BSF)
+=
mjpega_dump_header_bsf.o
OBJS-$(CONFIG_MPEG4_UNPACK_BFRAMES_BSF)
+=
mpeg4_unpack_bframes_bsf.o
...
...
libavcodec/bitstream_filters.c
View file @
00994e8b
...
...
@@ -43,6 +43,7 @@ extern const FFBitStreamFilter ff_hapqa_extract_bsf;
extern
const
FFBitStreamFilter
ff_hevc_metadata_bsf
;
extern
const
FFBitStreamFilter
ff_hevc_mp4toannexb_bsf
;
extern
const
FFBitStreamFilter
ff_imx_dump_header_bsf
;
extern
const
FFBitStreamFilter
ff_media100_to_mjpegb_bsf
;
extern
const
FFBitStreamFilter
ff_mjpeg2jpeg_bsf
;
extern
const
FFBitStreamFilter
ff_mjpega_dump_header_bsf
;
extern
const
FFBitStreamFilter
ff_mp3_header_decompress_bsf
;
...
...
libavcodec/media100.c
→
libavcodec/media100
_to_mjpegb_bsf
.c
View file @
00994e8b
/*
* Media 100
decod
er
* Copyright (c) 202
2
Paul B Mahol
* Media 100
to MJPEGB bitstream filt
er
* Copyright (c) 202
3
Paul B Mahol
*
* This file is part of FFmpeg.
*
...
...
@@ -21,55 +21,22 @@
/**
* @file
* Media 100
decod
er.
* Media 100
to MJPEGB bitstream filt
er.
*/
#include <inttypes.h>
#include "libavutil/intreadwrite.h"
#include "avcodec.h"
#include "bsf.h"
#include "bsf_internal.h"
#include "bytestream.h"
#include "codec_internal.h"
typedef
struct
Media100Context
{
AVCodecContext
*
avctx
;
// wrapper context for mjpegb
AVPacket
*
pkt
;
}
Media100Context
;
static
av_cold
int
media100_decode_init
(
AVCodecContext
*
av
ctx
)
static
av_cold
int
init
(
AVBSFContext
*
ctx
)
{
Media100Context
*
ctx
=
avctx
->
priv_data
;
const
AVCodec
*
codec
;
int
ret
;
codec
=
avcodec_find_decoder
(
AV_CODEC_ID_MJPEGB
);
if
(
!
codec
)
return
AVERROR_BUG
;
ctx
->
avctx
=
avcodec_alloc_context3
(
codec
);
if
(
!
ctx
->
avctx
)
return
AVERROR
(
ENOMEM
);
ctx
->
avctx
->
thread_count
=
1
;
ctx
->
avctx
->
flags
=
avctx
->
flags
;
ctx
->
avctx
->
flags2
=
avctx
->
flags2
;
ctx
->
avctx
->
width
=
ctx
->
avctx
->
coded_width
=
avctx
->
width
;
ctx
->
avctx
->
height
=
ctx
->
avctx
->
coded_height
=
avctx
->
height
;
ret
=
avcodec_open2
(
ctx
->
avctx
,
codec
,
NULL
);
if
(
ret
<
0
)
return
ret
;
ctx
->
pkt
=
av_packet_alloc
();
if
(
!
ctx
->
pkt
)
return
AVERROR
(
ENOMEM
);
ctx
->
par_out
->
codec_id
=
AV_CODEC_ID_MJPEGB
;
return
0
;
}
static
int
media100_decode_frame
(
AVCodecContext
*
avctx
,
AVFrame
*
frame
,
int
*
got_frame
,
AVPacket
*
avpkt
)
static
int
filter
(
AVBSFContext
*
ctx
,
AVPacket
*
out
)
{
Media100Context
*
ctx
=
avctx
->
priv_data
;
unsigned
second_field_offset
=
0
;
unsigned
next_field
=
0
;
unsigned
dht_offset
[
2
];
...
...
@@ -80,21 +47,19 @@ static int media100_decode_frame(AVCodecContext *avctx,
unsigned
field
=
0
;
GetByteContext
gb
;
PutByteContext
pb
;
AVPacket
*
pkt
;
AVPacket
*
in
;
int
ret
;
if
(
avpkt
->
size
+
1024
>
ctx
->
pkt
->
size
)
{
ret
=
av_grow_packet
(
ctx
->
pkt
,
avpkt
->
size
+
1024
-
ctx
->
pkt
->
size
);
if
(
ret
<
0
)
return
ret
;
}
ret
=
av_packet_make_writable
(
ctx
->
pkt
);
ret
=
ff_bsf_get_packet
(
ctx
,
&
in
);
if
(
ret
<
0
)
return
ret
;
bytestream2_init
(
&
gb
,
avpkt
->
data
,
avpkt
->
size
);
bytestream2_init_writer
(
&
pb
,
ctx
->
pkt
->
data
,
ctx
->
pkt
->
size
);
ret
=
av_new_packet
(
out
,
in
->
size
+
1024
);
if
(
ret
<
0
)
goto
fail
;
bytestream2_init
(
&
gb
,
in
->
data
,
in
->
size
);
bytestream2_init_writer
(
&
pb
,
out
->
data
,
out
->
size
);
second_field:
bytestream2_put_be32
(
&
pb
,
0
);
...
...
@@ -107,8 +72,8 @@ second_field:
sof_offset
[
field
]
=
bytestream2_tell_p
(
&
pb
);
bytestream2_put_be16
(
&
pb
,
17
);
bytestream2_put_byte
(
&
pb
,
8
);
bytestream2_put_be16
(
&
pb
,
avctx
->
height
/
2
);
bytestream2_put_be16
(
&
pb
,
avctx
->
width
);
bytestream2_put_be16
(
&
pb
,
ctx
->
par_in
->
height
/
2
);
bytestream2_put_be16
(
&
pb
,
ctx
->
par_in
->
width
);
bytestream2_put_byte
(
&
pb
,
3
);
bytestream2_put_byte
(
&
pb
,
1
);
bytestream2_put_byte
(
&
pb
,
0x21
);
...
...
@@ -146,8 +111,8 @@ second_field:
dht_offset
[
field
]
=
0
;
sod_offset
[
field
]
=
bytestream2_tell_p
(
&
pb
);
for
(
int
i
=
bytestream2_tell
(
&
gb
)
+
8
;
next_field
==
0
&&
i
<
avpkt
->
size
-
4
;
i
++
)
{
if
(
AV_RB32
(
avpkt
->
data
+
i
)
==
0x00000001
)
{
for
(
int
i
=
bytestream2_tell
(
&
gb
)
+
8
;
next_field
==
0
&&
i
<
in
->
size
-
4
;
i
++
)
{
if
(
AV_RB32
(
in
->
data
+
i
)
==
0x00000001
)
{
next_field
=
i
;
break
;
}
...
...
@@ -160,65 +125,44 @@ second_field:
if
(
field
==
0
)
{
field
=
1
;
second_field_offset
=
bytestream2_tell_p
(
&
pb
);
next_field
=
avpkt
->
size
;
next_field
=
in
->
size
;
goto
second_field
;
}
pkt
=
ctx
->
pkt
;
AV_WB32
(
pkt
->
data
+
8
,
second_field_offset
);
AV_WB32
(
pkt
->
data
+
12
,
second_field_offset
);
AV_WB32
(
pkt
->
data
+
16
,
second_field_offset
);
AV_WB32
(
pkt
->
data
+
20
,
dqt_offset
[
0
]);
AV_WB32
(
pkt
->
data
+
24
,
dht_offset
[
0
]);
AV_WB32
(
pkt
->
data
+
28
,
sof_offset
[
0
]);
AV_WB32
(
pkt
->
data
+
32
,
sos_offset
[
0
]);
AV_WB32
(
pkt
->
data
+
36
,
sod_offset
[
0
]);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
8
,
bytestream2_tell_p
(
&
pb
)
-
second_field_offset
);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
12
,
bytestream2_tell_p
(
&
pb
)
-
second_field_offset
);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
16
,
0
);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
20
,
dqt_offset
[
1
]
-
second_field_offset
);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
24
,
dht_offset
[
1
]);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
28
,
sof_offset
[
1
]
-
second_field_offset
);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
32
,
sos_offset
[
1
]
-
second_field_offset
);
AV_WB32
(
pkt
->
data
+
second_field_offset
+
36
,
sod_offset
[
1
]
-
second_field_offset
);
pkt
->
size
=
bytestream2_tell_p
(
&
pb
);
ret
=
avcodec_send_packet
(
ctx
->
avctx
,
pkt
);
if
(
ret
<
0
)
{
av_log
(
avctx
,
AV_LOG_ERROR
,
"Error submitting a packet for decoding
\n
"
);
return
ret
;
}
ret
=
avcodec_receive_frame
(
ctx
->
avctx
,
frame
);
AV_WB32
(
out
->
data
+
8
,
second_field_offset
);
AV_WB32
(
out
->
data
+
12
,
second_field_offset
);
AV_WB32
(
out
->
data
+
16
,
second_field_offset
);
AV_WB32
(
out
->
data
+
20
,
dqt_offset
[
0
]);
AV_WB32
(
out
->
data
+
24
,
dht_offset
[
0
]);
AV_WB32
(
out
->
data
+
28
,
sof_offset
[
0
]);
AV_WB32
(
out
->
data
+
32
,
sos_offset
[
0
]);
AV_WB32
(
out
->
data
+
36
,
sod_offset
[
0
]);
AV_WB32
(
out
->
data
+
second_field_offset
+
8
,
bytestream2_tell_p
(
&
pb
)
-
second_field_offset
);
AV_WB32
(
out
->
data
+
second_field_offset
+
12
,
bytestream2_tell_p
(
&
pb
)
-
second_field_offset
);
AV_WB32
(
out
->
data
+
second_field_offset
+
16
,
0
);
AV_WB32
(
out
->
data
+
second_field_offset
+
20
,
dqt_offset
[
1
]
-
second_field_offset
);
AV_WB32
(
out
->
data
+
second_field_offset
+
24
,
dht_offset
[
1
]);
AV_WB32
(
out
->
data
+
second_field_offset
+
28
,
sof_offset
[
1
]
-
second_field_offset
);
AV_WB32
(
out
->
data
+
second_field_offset
+
32
,
sos_offset
[
1
]
-
second_field_offset
);
AV_WB32
(
out
->
data
+
second_field_offset
+
36
,
sod_offset
[
1
]
-
second_field_offset
);
out
->
size
=
bytestream2_tell_p
(
&
pb
);
ret
=
av_packet_copy_props
(
out
,
in
);
if
(
ret
<
0
)
return
ret
;
*
got_frame
=
1
;
return
avpkt
->
size
;
}
static
av_cold
int
media100_decode_end
(
AVCodecContext
*
avctx
)
{
Media100Context
*
ctx
=
avctx
->
priv_data
;
goto
fail
;
avcodec_free_context
(
&
ctx
->
avctx
);
av_packet_free
(
&
ctx
->
pkt
);
return
0
;
fail:
if
(
ret
<
0
)
av_packet_unref
(
out
);
av_packet_free
(
&
in
);
return
ret
;
}
const
FFCodec
ff_media100_decoder
=
{
.
p
.
name
=
"media100"
,
CODEC_LONG_NAME
(
"Media 100"
),
.
p
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
p
.
id
=
AV_CODEC_ID_MEDIA100
,
.
priv_data_size
=
sizeof
(
Media100Context
),
.
init
=
media100_decode_init
,
.
close
=
media100_decode_end
,
FF_CODEC_DECODE_CB
(
media100_decode_frame
),
.
caps_internal
=
FF_CODEC_CAP_INIT_CLEANUP
,
const
FFBitStreamFilter
ff_media100_to_mjpegb_bsf
=
{
.
p
.
name
=
"media100_to_mjpegb"
,
.
p
.
codec_ids
=
(
const
enum
AVCodecID
[]){
AV_CODEC_ID_MEDIA100
,
AV_CODEC_ID_NONE
},
.
init
=
init
,
.
filter
=
filter
,
};
libavcodec/mjpegbdec.c
View file @
00994e8b
...
...
@@ -168,3 +168,18 @@ const FFCodec ff_mjpegb_decoder = {
.
p
.
max_lowres
=
3
,
.
caps_internal
=
FF_CODEC_CAP_INIT_CLEANUP
,
};
const
FFCodec
ff_media100_decoder
=
{
.
p
.
name
=
"media100"
,
CODEC_LONG_NAME
(
"Media 100"
),
.
p
.
type
=
AVMEDIA_TYPE_VIDEO
,
.
p
.
id
=
AV_CODEC_ID_MEDIA100
,
.
priv_data_size
=
sizeof
(
MJpegDecodeContext
),
.
init
=
ff_mjpeg_decode_init
,
.
close
=
ff_mjpeg_decode_end
,
FF_CODEC_DECODE_CB
(
mjpegb_decode_frame
),
.
p
.
capabilities
=
AV_CODEC_CAP_DR1
,
.
p
.
max_lowres
=
3
,
.
caps_internal
=
FF_CODEC_CAP_INIT_CLEANUP
,
.
bsfs
=
"media100_to_mjpegb"
,
};
libavcodec/version.h
View file @
00994e8b
...
...
@@ -29,7 +29,7 @@
#include "version_major.h"
#define LIBAVCODEC_VERSION_MINOR 6
0
#define LIBAVCODEC_VERSION_MINOR 6
1
#define LIBAVCODEC_VERSION_MICRO 100
#define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \
...
...
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