]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-11521: [mod_av] support colorspace from params of file interface
authorLiyang <liyang@x-y-t.cn>
Wed, 14 Nov 2018 09:04:48 +0000 (17:04 +0800)
committerAndrey Volk <andywolk@gmail.com>
Wed, 2 Jan 2019 20:23:13 +0000 (00:23 +0400)
https://freeswitch.org/jira/browse/FS-11521

src/mod/applications/mod_av/avformat.c
src/mod/applications/mod_av/test/test_avformat.c

index d338ed8b8ccd6ee9ebeccb5d109799e23ccc29f2..67628da7cd3d138fd8ae7203c917e24f28d89b45 100644 (file)
@@ -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);
index 248d43f93062cb1044f1b2c3bfd32c17be2d33e8..39df7d6c01de9961c318a62ee00852ac70d65c90 100644 (file)
@@ -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()
        }