| 108 | } |
| 109 | |
| 110 | static HEVCFrame *alloc_frame(HEVCContext *s, HEVCLayerContext *l) |
| 111 | { |
| 112 | const HEVCVPS *vps = l->sps->vps; |
| 113 | const int view_id = vps->view_id[s->cur_layer]; |
| 114 | int i, j, ret; |
| 115 | for (i = 0; i < FF_ARRAY_ELEMS(l->DPB); i++) { |
| 116 | HEVCFrame *frame = &l->DPB[i]; |
| 117 | if (frame->f) |
| 118 | continue; |
| 119 | |
| 120 | ret = ff_progress_frame_alloc(s->avctx, &frame->tf); |
| 121 | if (ret < 0) |
| 122 | return NULL; |
| 123 | |
| 124 | // Add LCEVC SEI metadata here, as it's needed in get_buffer() |
| 125 | if (s->sei.common.lcevc.info) { |
| 126 | HEVCSEILCEVC *lcevc = &s->sei.common.lcevc; |
| 127 | ret = ff_frame_new_side_data_from_buf(s->avctx, frame->tf.f, |
| 128 | AV_FRAME_DATA_LCEVC, &lcevc->info); |
| 129 | if (ret < 0) |
| 130 | goto fail; |
| 131 | } |
| 132 | |
| 133 | // add view ID side data if it's nontrivial |
| 134 | if (!ff_hevc_is_alpha_video(s) && (vps->nb_layers > 1 || view_id)) { |
| 135 | HEVCSEITDRDI *tdrdi = &s->sei.tdrdi; |
| 136 | AVFrameSideData *sd = av_frame_side_data_new(&frame->f->side_data, |
| 137 | &frame->f->nb_side_data, |
| 138 | AV_FRAME_DATA_VIEW_ID, |
| 139 | sizeof(int), 0); |
| 140 | if (!sd) |
| 141 | goto fail; |
| 142 | *(int*)sd->data = view_id; |
| 143 | |
| 144 | if (tdrdi->num_ref_displays) { |
| 145 | AVStereo3D *stereo_3d; |
| 146 | |
| 147 | stereo_3d = av_stereo3d_create_side_data(frame->f); |
| 148 | if (!stereo_3d) |
| 149 | goto fail; |
| 150 | |
| 151 | stereo_3d->type = AV_STEREO3D_FRAMESEQUENCE; |
| 152 | if (tdrdi->left_view_id[0] == view_id) |
| 153 | stereo_3d->view = AV_STEREO3D_VIEW_LEFT; |
| 154 | else if (tdrdi->right_view_id[0] == view_id) |
| 155 | stereo_3d->view = AV_STEREO3D_VIEW_RIGHT; |
| 156 | else |
| 157 | stereo_3d->view = AV_STEREO3D_VIEW_UNSPEC; |
| 158 | } |
| 159 | } |
| 160 | |
| 161 | ret = ff_thread_get_buffer(s->avctx, frame->f, AV_GET_BUFFER_FLAG_REF); |
| 162 | if (ret < 0) |
| 163 | goto fail; |
| 164 | |
| 165 | size_t rpl_bytes; |
| 166 | if (av_size_mult(s->pkt.nb_nals, sizeof(*frame->rpl), &rpl_bytes) < 0) |
| 167 | goto fail; |
no test coverage detected