FFmpeg
libavcodec
rv34_parser.c
Go to the documentation of this file.
1
/*
2
* RV30/40 parser
3
* Copyright (c) 2011 Konstantin Shishkov
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
* RV30/40 parser
25
*/
26
27
#include "config_components.h"
28
29
#include "
parser.h
"
30
#include "
libavutil/intreadwrite.h
"
31
32
typedef
struct
RV34ParseContext
{
33
ParseContext
pc
;
34
int64_t
key_dts
;
35
int
key_pts
;
36
}
RV34ParseContext
;
37
38
static
const
int
rv_to_av_frame_type
[4] = {
39
AV_PICTURE_TYPE_I
,
AV_PICTURE_TYPE_I
,
AV_PICTURE_TYPE_P
,
AV_PICTURE_TYPE_B
,
40
};
41
42
static
int
rv34_parse
(
AVCodecParserContext
*
s
,
43
AVCodecContext
*avctx,
44
const
uint8_t **poutbuf,
int
*poutbuf_size,
45
const
uint8_t *buf,
int
buf_size)
46
{
47
RV34ParseContext
*pc =
s
->priv_data;
48
int
type
,
pts
, hdr;
49
50
if
(buf_size < 13 + *buf * 8) {
51
*poutbuf = buf;
52
*poutbuf_size = buf_size;
53
return
buf_size;
54
}
55
56
hdr =
AV_RB32
(buf + 9 + *buf * 8);
57
if
(avctx->
codec_id
==
AV_CODEC_ID_RV30
) {
58
type
= (hdr >> 27) & 3;
59
pts
= (hdr >> 7) & 0x1FFF;
60
}
else
{
61
type
= (hdr >> 29) & 3;
62
pts
= (hdr >> 6) & 0x1FFF;
63
}
64
65
if
(
type
!= 3 &&
s
->pts !=
AV_NOPTS_VALUE
) {
66
pc->
key_dts
=
s
->pts;
67
pc->
key_pts
=
pts
;
68
}
else
{
69
if
(
type
!= 3)
70
s
->pts = pc->
key_dts
+ ((
pts
- pc->
key_pts
) & 0x1FFF);
71
else
72
s
->pts = pc->
key_dts
- ((pc->
key_pts
-
pts
) & 0x1FFF);
73
}
74
s
->pict_type =
rv_to_av_frame_type
[
type
];
75
76
*poutbuf = buf;
77
*poutbuf_size = buf_size;
78
return
buf_size;
79
}
80
81
#if CONFIG_RV30_PARSER
82
const
AVCodecParser
ff_rv30_parser
= {
83
.
codec_ids
= {
AV_CODEC_ID_RV30
},
84
.priv_data_size =
sizeof
(
RV34ParseContext
),
85
.parser_parse =
rv34_parse
,
86
};
87
#endif
88
89
#if CONFIG_RV40_PARSER
90
const
AVCodecParser
ff_rv40_parser
= {
91
.
codec_ids
= {
AV_CODEC_ID_RV40
},
92
.priv_data_size =
sizeof
(
RV34ParseContext
),
93
.parser_parse =
rv34_parse
,
94
};
95
#endif
rv34_parse
static int rv34_parse(AVCodecParserContext *s, AVCodecContext *avctx, const uint8_t **poutbuf, int *poutbuf_size, const uint8_t *buf, int buf_size)
Definition:
rv34_parser.c:42
rv_to_av_frame_type
static const int rv_to_av_frame_type[4]
Definition:
rv34_parser.c:38
RV34ParseContext::key_pts
int key_pts
Definition:
rv34_parser.c:35
ParseContext
Definition:
parser.h:28
type
it s the only field you need to keep assuming you have a context There is some magic you don t need to care about around this just let it vf type
Definition:
writing_filters.txt:86
pts
static int64_t pts
Definition:
transcode_aac.c:654
intreadwrite.h
s
#define s(width, name)
Definition:
cbs_vp9.c:256
ff_rv40_parser
const AVCodecParser ff_rv40_parser
RV34ParseContext::pc
ParseContext pc
Definition:
rv34_parser.c:33
AVCodecContext::codec_id
enum AVCodecID codec_id
Definition:
avcodec.h:399
ff_rv30_parser
const AVCodecParser ff_rv30_parser
AV_PICTURE_TYPE_I
@ AV_PICTURE_TYPE_I
Intra.
Definition:
avutil.h:274
AVCodecParser::codec_ids
int codec_ids[7]
Definition:
avcodec.h:2949
AV_NOPTS_VALUE
#define AV_NOPTS_VALUE
Undefined timestamp value.
Definition:
avutil.h:248
AV_RB32
uint64_t_TMPL AV_WL64 unsigned int_TMPL AV_WL32 unsigned int_TMPL AV_WL24 unsigned int_TMPL AV_WL16 uint64_t_TMPL AV_WB64 unsigned int_TMPL AV_RB32
Definition:
bytestream.h:96
AV_CODEC_ID_RV30
@ AV_CODEC_ID_RV30
Definition:
codec_id.h:118
AV_CODEC_ID_RV40
@ AV_CODEC_ID_RV40
Definition:
codec_id.h:119
RV34ParseContext::key_dts
int64_t key_dts
Definition:
rv34_parser.c:34
parser.h
AVCodecParserContext
Definition:
avcodec.h:2789
AVCodecContext
main external API structure.
Definition:
avcodec.h:389
AV_PICTURE_TYPE_B
@ AV_PICTURE_TYPE_B
Bi-dir predicted.
Definition:
avutil.h:276
AV_PICTURE_TYPE_P
@ AV_PICTURE_TYPE_P
Predicted.
Definition:
avutil.h:275
AVCodecParser
Definition:
avcodec.h:2948
RV34ParseContext
Definition:
rv34_parser.c:32
Generated on Wed Aug 24 2022 21:41:46 for FFmpeg by
1.8.17