1 /*
2 * H.265 video codec.
3 * Copyright (c) 2013-2014 struktur AG, Dirk Farin <farin@struktur.de>
4 *
5 * This file is part of libde265.
6 *
7 * libde265 is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Lesser General Public License as
9 * published by the Free Software Foundation, either version 3 of
10 * the License, or (at your option) any later version.
11 *
12 * libde265 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
15 * GNU Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public License
18 * along with libde265. If not, see <http://www.gnu.org/licenses/>.
19 */
20
21 #include "libde265/encoder/sop.h"
22 #include "libde265/encoder/encoder-context.h"
23
24
sop_creator_intra_only()25 sop_creator_intra_only::sop_creator_intra_only()
26 {
27 }
28
29
set_SPS_header_values()30 void sop_creator_intra_only::set_SPS_header_values()
31 {
32 mEncCtx->sps.log2_max_pic_order_cnt_lsb = get_num_poc_lsb_bits();
33 }
34
35
insert_new_input_image(de265_image * img)36 void sop_creator_intra_only::insert_new_input_image(de265_image* img)
37 {
38 img->PicOrderCntVal = get_pic_order_count();
39
40 reset_poc();
41 int poc = get_pic_order_count();
42
43 assert(mEncPicBuf);
44 image_data* imgdata = mEncPicBuf->insert_next_image_in_encoding_order(img, get_frame_number());
45
46 imgdata->set_intra();
47 imgdata->set_NAL_type(NAL_UNIT_IDR_N_LP);
48 imgdata->shdr.slice_type = SLICE_TYPE_I;
49 imgdata->shdr.slice_pic_order_cnt_lsb = get_pic_order_count_lsb();
50
51 mEncPicBuf->sop_metadata_commit(get_frame_number());
52
53 advance_frame();
54 }
55
56
57 // ---------------------------------------------------------------------------
58
59
sop_creator_trivial_low_delay()60 sop_creator_trivial_low_delay::sop_creator_trivial_low_delay()
61 {
62 }
63
64
set_SPS_header_values()65 void sop_creator_trivial_low_delay::set_SPS_header_values()
66 {
67 ref_pic_set rps;
68 rps.DeltaPocS0[0] = -1;
69 rps.UsedByCurrPicS0[0] = true;
70 rps.NumNegativePics = 1;
71 rps.NumPositivePics = 0;
72 rps.compute_derived_values();
73 mEncCtx->sps.ref_pic_sets.push_back(rps);
74 mEncCtx->sps.log2_max_pic_order_cnt_lsb = get_num_poc_lsb_bits();
75 }
76
77
insert_new_input_image(de265_image * img)78 void sop_creator_trivial_low_delay::insert_new_input_image(de265_image* img)
79 {
80 img->PicOrderCntVal = get_pic_order_count();
81
82 int frame = get_frame_number();
83
84 std::vector<int> l0, l1, empty;
85 if (!isIntra(frame)) {
86 l0.push_back(frame-1);
87 }
88
89 assert(mEncPicBuf);
90 image_data* imgdata = mEncPicBuf->insert_next_image_in_encoding_order(img, get_frame_number());
91
92 if (isIntra(frame)) {
93 reset_poc();
94 imgdata->set_intra();
95 imgdata->set_NAL_type(NAL_UNIT_IDR_N_LP);
96 imgdata->shdr.slice_type = SLICE_TYPE_I;
97 } else {
98 imgdata->set_references(0, l0,l1, empty,empty);
99 imgdata->set_NAL_type(NAL_UNIT_TRAIL_R);
100 imgdata->shdr.slice_type = SLICE_TYPE_P;
101 }
102 imgdata->shdr.slice_pic_order_cnt_lsb = get_pic_order_count_lsb();
103 mEncPicBuf->sop_metadata_commit(get_frame_number());
104
105 advance_frame();
106 }
107