blob: 8691d1880ec64e5bf827dcf18c742c2d9cf40614
1 | /* |
2 | * RV10 encoder |
3 | * Copyright (c) 2000,2001 Fabrice Bellard |
4 | * Copyright (c) 2002-2004 Michael Niedermayer |
5 | * |
6 | * This file is part of FFmpeg. |
7 | * |
8 | * FFmpeg is free software; you can redistribute it and/or |
9 | * modify it under the terms of the GNU Lesser General Public |
10 | * License as published by the Free Software Foundation; either |
11 | * version 2.1 of the License, or (at your option) any later version. |
12 | * |
13 | * FFmpeg is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
16 | * Lesser General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU Lesser General Public |
19 | * License along with FFmpeg; if not, write to the Free Software |
20 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
21 | */ |
22 | |
23 | /** |
24 | * @file |
25 | * RV10 encoder |
26 | */ |
27 | |
28 | #include "mpegvideo.h" |
29 | #include "put_bits.h" |
30 | #include "rv10.h" |
31 | |
32 | int ff_rv10_encode_picture_header(MpegEncContext *s, int picture_number) |
33 | { |
34 | int full_frame= 0; |
35 | |
36 | avpriv_align_put_bits(&s->pb); |
37 | |
38 | put_bits(&s->pb, 1, 1); /* marker */ |
39 | |
40 | put_bits(&s->pb, 1, (s->pict_type == AV_PICTURE_TYPE_P)); |
41 | |
42 | put_bits(&s->pb, 1, 0); /* not PB-mframe */ |
43 | |
44 | put_bits(&s->pb, 5, s->qscale); |
45 | |
46 | if (s->pict_type == AV_PICTURE_TYPE_I) { |
47 | /* specific MPEG like DC coding not used */ |
48 | } |
49 | /* if multiple packets per frame are sent, the position at which |
50 | to display the macroblocks is coded here */ |
51 | if(!full_frame){ |
52 | if (s->mb_width * s->mb_height >= (1U << 12)) { |
53 | avpriv_report_missing_feature(s->avctx, "Encoding frames with %d (>= 4096) macroblocks", |
54 | s->mb_width * s->mb_height); |
55 | return AVERROR(ENOSYS); |
56 | } |
57 | put_bits(&s->pb, 6, 0); /* mb_x */ |
58 | put_bits(&s->pb, 6, 0); /* mb_y */ |
59 | put_bits(&s->pb, 12, s->mb_width * s->mb_height); |
60 | } |
61 | |
62 | put_bits(&s->pb, 3, 0); /* ignored */ |
63 | return 0; |
64 | } |
65 | |
66 | static const AVClass rv10_class = { |
67 | .class_name = "rv10 encoder", |
68 | .item_name = av_default_item_name, |
69 | .option = ff_mpv_generic_options, |
70 | .version = LIBAVUTIL_VERSION_INT, |
71 | }; |
72 | |
73 | AVCodec ff_rv10_encoder = { |
74 | .name = "rv10", |
75 | .long_name = NULL_IF_CONFIG_SMALL("RealVideo 1.0"), |
76 | .type = AVMEDIA_TYPE_VIDEO, |
77 | .id = AV_CODEC_ID_RV10, |
78 | .priv_data_size = sizeof(MpegEncContext), |
79 | .init = ff_mpv_encode_init, |
80 | .encode2 = ff_mpv_encode_picture, |
81 | .close = ff_mpv_encode_end, |
82 | .pix_fmts = (const enum AVPixelFormat[]){ AV_PIX_FMT_YUV420P, AV_PIX_FMT_NONE }, |
83 | .priv_class = &rv10_class, |
84 | }; |
85 |