////////////////////////////////////////////////////////////////////////// // SETUP, TEARDOWN AND HELPER FUNCTIONS static void setup_tests() { g_pic = kvz_image_alloc(KVZ_CSP_420, 8, 8); for (int i = 0; i < 64; ++i) { g_pic->y[i] = pic_data[i] + 48; } g_ref = kvz_image_alloc(KVZ_CSP_420, 8, 8); for (int i = 0; i < 64; ++i) { g_ref->y[i] = ref_data[i] + 48; } g_big_pic = kvz_image_alloc(KVZ_CSP_420, 64, 64); for (int i = 0; i < 64*64; ++i) { g_big_pic->y[i] = (i*i / 32 + i) % 255; //g_big_pic->y[i] = i % 255; } g_big_ref = kvz_image_alloc(KVZ_CSP_420, 64, 64); for (int i = 0; i < 64 * 64; ++i) { g_big_ref->y[i] = (i*i / 16 + i) % 255; //g_big_ref->y[i] = (i / 2) % 255; } g_64x64_zero = kvz_image_alloc(KVZ_CSP_420, 64, 64); memset(g_64x64_zero->y, 0, 64 * 64 * sizeof(kvz_pixel)); g_64x64_max = kvz_image_alloc(KVZ_CSP_420, 64, 64); memset(g_64x64_max->y, PIXEL_MAX, 64 * 64 * sizeof(kvz_pixel)); }
static int kvazaar_field_encoding_adapter(kvz_encoder *enc, kvz_picture *pic_in, kvz_data_chunk **data_out, uint32_t *len_out, kvz_picture **pic_out, kvz_picture **src_out, kvz_frame_info *info_out) { if (enc->control->cfg->source_scan_type == KVZ_INTERLACING_NONE) { // For progressive, simply call the normal encoding function. return kvazaar_encode(enc, pic_in, data_out, len_out, pic_out, src_out, info_out); } // For interlaced, make two fields out of the input frame and call encode on them separately. encoder_state_t *state = &enc->states[enc->cur_state_num]; kvz_picture *first_field = NULL, *second_field = NULL; struct { kvz_data_chunk* data_out; uint32_t len_out; } first = { 0 }, second = { 0 }; if (pic_in != NULL) { first_field = kvz_image_alloc(state->encoder_control->in.width, state->encoder_control->in.height); if (first_field == NULL) { goto kvazaar_field_encoding_adapter_failure; } second_field = kvz_image_alloc(state->encoder_control->in.width, state->encoder_control->in.height); if (second_field == NULL) { goto kvazaar_field_encoding_adapter_failure; } yuv_io_extract_field(pic_in, pic_in->interlacing, 0, first_field); yuv_io_extract_field(pic_in, pic_in->interlacing, 1, second_field); first_field->pts = pic_in->pts; first_field->dts = pic_in->dts; first_field->interlacing = pic_in->interlacing; // Should the second field have higher pts and dts? It shouldn't affect anything. second_field->pts = pic_in->pts; second_field->dts = pic_in->dts; second_field->interlacing = pic_in->interlacing; } if (!kvazaar_encode(enc, first_field, &first.data_out, &first.len_out, pic_out, NULL, info_out)) { goto kvazaar_field_encoding_adapter_failure; } if (!kvazaar_encode(enc, second_field, &second.data_out, &second.len_out, NULL, NULL, NULL)) { goto kvazaar_field_encoding_adapter_failure; } kvz_image_free(first_field); kvz_image_free(second_field); // Concatenate bitstreams. if (len_out != NULL) { *len_out = first.len_out + second.len_out; } if (data_out != NULL) { *data_out = first.data_out; if (first.data_out != NULL) { kvz_data_chunk *chunk = first.data_out; while (chunk->next != NULL) { chunk = chunk->next; } chunk->next = second.data_out; } } if (src_out != NULL) { // TODO: deinterlace the fields to one picture. } return 1; kvazaar_field_encoding_adapter_failure: kvz_image_free(first_field); kvz_image_free(second_field); kvz_bitstream_free_chunks(first.data_out); kvz_bitstream_free_chunks(second.data_out); return 0; }