From 036d3e80857ad1414fb036ca9e6e6cb0a9d477f4 Mon Sep 17 00:00:00 2001 From: Liyang Date: Wed, 14 Nov 2018 17:04:48 +0800 Subject: [PATCH] FS-11521: [mod_av] support colorspace from params of file interface https://freeswitch.org/jira/browse/FS-11521 --- src/mod/applications/mod_av/avformat.c | 15 ++++- .../applications/mod_av/test/test_avformat.c | 67 +++++++++++++++++-- 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/src/mod/applications/mod_av/avformat.c b/src/mod/applications/mod_av/avformat.c index d338ed8b8c..67628da7cd 100644 --- a/src/mod/applications/mod_av/avformat.c +++ b/src/mod/applications/mod_av/avformat.c @@ -126,6 +126,7 @@ struct av_file_context { AVFormatContext *fc; AVCodec *audio_codec; AVCodec *video_codec; + enum AVColorSpace colorspace; int has_audio; int has_video; @@ -573,8 +574,9 @@ GCC_DIAG_ON(deprecated-declarations) // av_opt_set_int(c->priv_data, "slice-max-size", SWITCH_DEFAULT_VIDEO_SIZE, 0); - c->colorspace = avformat_globals.colorspace; + c->colorspace = context->colorspace; c->color_range = AVCOL_RANGE_JPEG; + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "colorspace = %d\n", c->colorspace); break; default: @@ -1605,7 +1607,8 @@ static switch_status_t av_file_open(switch_file_handle_t *handle, const char *pa context->offset = DFT_RECORD_OFFSET; context->handle = handle; context->audio_timer = 1; - + context->colorspace = avformat_globals.colorspace; + if (handle->params) { if ((tmp = switch_event_get_header(handle->params, "av_video_offset"))) { context->offset = atoi(tmp); @@ -1615,6 +1618,14 @@ static switch_status_t av_file_open(switch_file_handle_t *handle, const char *pa context->audio_timer = 0; } } + if ((tmp = switch_event_get_header(handle->params, "colorspace"))) { + int value = atoi(tmp); + enum AVColorSpace colorspace = UINTVAL(value); + + if (colorspace <= AVCOL_SPC_NB) { + context->colorspace = colorspace; + } + } } switch_mutex_init(&context->mutex, SWITCH_MUTEX_NESTED, handle->memory_pool); diff --git a/src/mod/applications/mod_av/test/test_avformat.c b/src/mod/applications/mod_av/test/test_avformat.c index 248d43f930..39df7d6c01 100644 --- a/src/mod/applications/mod_av/test/test_avformat.c +++ b/src/mod/applications/mod_av/test/test_avformat.c @@ -42,11 +42,11 @@ FST_CORE_BEGIN("conf") } FST_SETUP_END() - FST_TEST_BEGIN(avformat_test) + FST_TEST_BEGIN(avformat_test_colorspace_RGB) { switch_status_t status; switch_image_t *img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, 1280, 720, 1); - switch_file_handle_t fh = { 0 }; + switch_file_handle_t fh = { 0 }; uint8_t data[SAMPLES * 2] = { 0 }; switch_frame_t frame = { 0 }; switch_size_t len = SAMPLES; @@ -54,9 +54,9 @@ FST_CORE_BEGIN("conf") fst_requires(img); - status = switch_core_file_open(&fh, "./test.mp4", 1, 8000, flags, fst_pool); + status = switch_core_file_open(&fh, "{colorspace=0}./test_RGB.mp4", 1, 8000, flags, fst_pool); fst_requires(status == SWITCH_STATUS_SUCCESS); - fst_requires(switch_test_flag(&fh, SWITCH_FILE_OPEN)); + fst_requires(switch_test_flag(&fh, SWITCH_FILE_OPEN)); status = switch_core_file_write(&fh, data, &len); switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "status: %d len: %d\n", status, len); @@ -91,7 +91,62 @@ FST_CORE_BEGIN("conf") switch_yield(100000); } - switch_core_file_close(&fh); + switch_core_file_close(&fh); + switch_img_free(&img); + switch_img_free(&ccimg); + } + FST_TEST_END() + + FST_TEST_BEGIN(avformat_test_colorspace_BT7) + { + switch_status_t status; + switch_image_t *img = switch_img_alloc(NULL, SWITCH_IMG_FMT_I420, 1280, 720, 1); + switch_file_handle_t fh = { 0 }; + uint8_t data[SAMPLES * 2] = { 0 }; + switch_frame_t frame = { 0 }; + switch_size_t len = SAMPLES; + uint32_t flags = SWITCH_FILE_FLAG_WRITE | SWITCH_FILE_DATA_SHORT | SWITCH_FILE_FLAG_VIDEO; + + fst_requires(img); + + status = switch_core_file_open(&fh, "{colorspace=1}./test_BT7.mp4", 1, 8000, flags, fst_pool); + fst_requires(status == SWITCH_STATUS_SUCCESS); + fst_requires(switch_test_flag(&fh, SWITCH_FILE_OPEN)); + + status = switch_core_file_write(&fh, data, &len); + switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "status: %d len: %d\n", status, len); + fst_check(status == SWITCH_STATUS_SUCCESS); + // fst_requires(len == SAMPLES); + + frame.img = img; + status = switch_core_file_write_video(&fh, &frame); + fst_check(status == SWITCH_STATUS_SUCCESS); + + switch_image_t *ccimg = switch_img_read_png("./cluecon.png", SWITCH_IMG_FMT_ARGB); + fst_requires(ccimg); + + switch_rgb_color_t color = {0}; + color.a = 255; + + for (int i = 0; i < 30; i++) { + len = SAMPLES; + + if (i == 10) { + color.r = 255; + } else if (i == 20) { + color.r = 0; + color.b = 255; + } + + switch_img_fill(img, 0, 0, img->d_w, img->d_h, &color); + switch_img_patch(img, ccimg, i * 10, i * 10); + + status = switch_core_file_write(&fh, data, &len); + status = switch_core_file_write_video(&fh, &frame); + switch_yield(100000); + } + + switch_core_file_close(&fh); switch_img_free(&img); switch_img_free(&ccimg); } @@ -101,7 +156,7 @@ FST_CORE_BEGIN("conf") { const char *err = NULL; switch_sleep(1000000); - fst_check(switch_loadable_module_unload_module(SWITCH_GLOBAL_dirs.mod_dir, (char *)"mod_av", SWITCH_TRUE, &err) == SWITCH_STATUS_SUCCESS); + //fst_check(switch_loadable_module_unload_module(SWITCH_GLOBAL_dirs.mod_dir, (char *)"mod_av", SWITCH_TRUE, &err) == SWITCH_STATUS_SUCCESS); } FST_TEARDOWN_END() }