avcodec/mjpegdec: export display matrix frame side data when available
Finishes fixing ticket #6945. Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
		
							parent
							
								
									42fce6fffe
								
							
						
					
					
						commit
						e93c998602
					
				@ -30,6 +30,7 @@
 | 
			
		||||
 * MJPEG decoder.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "libavutil/display.h"
 | 
			
		||||
#include "libavutil/imgutils.h"
 | 
			
		||||
#include "libavutil/avassert.h"
 | 
			
		||||
#include "libavutil/opt.h"
 | 
			
		||||
@ -2406,6 +2407,7 @@ int ff_mjpeg_receive_frame(AVCodecContext *avctx, AVFrame *frame)
 | 
			
		||||
    int i, index;
 | 
			
		||||
    int ret = 0;
 | 
			
		||||
    int is16bit;
 | 
			
		||||
    AVDictionaryEntry *e = NULL;
 | 
			
		||||
 | 
			
		||||
    s->force_pal8 = 0;
 | 
			
		||||
 | 
			
		||||
@ -2864,6 +2866,57 @@ the_end:
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (e = av_dict_get(s->exif_metadata, "Orientation", e, AV_DICT_IGNORE_SUFFIX)) {
 | 
			
		||||
        char *value = e->value + strspn(e->value, " \n\t\r"), *endptr;
 | 
			
		||||
        int orientation = strtol(value, &endptr, 0);
 | 
			
		||||
 | 
			
		||||
        if (!*endptr) {
 | 
			
		||||
            AVFrameSideData *sd = NULL;
 | 
			
		||||
 | 
			
		||||
            if (orientation >= 2 && orientation <= 8) {
 | 
			
		||||
                int32_t *matrix;
 | 
			
		||||
 | 
			
		||||
                sd = av_frame_new_side_data(frame, AV_FRAME_DATA_DISPLAYMATRIX, sizeof(int32_t) * 9);
 | 
			
		||||
                if (!sd) {
 | 
			
		||||
                    av_log(s->avctx, AV_LOG_ERROR, "Could not allocate frame side data\n");
 | 
			
		||||
                    return AVERROR(ENOMEM);
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                matrix = (int32_t *)sd->data;
 | 
			
		||||
 | 
			
		||||
                switch (orientation) {
 | 
			
		||||
                case 2:
 | 
			
		||||
                    av_display_rotation_set(matrix, 0.0);
 | 
			
		||||
                    av_display_matrix_flip(matrix, 1, 0);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 3:
 | 
			
		||||
                    av_display_rotation_set(matrix, 180.0);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 4:
 | 
			
		||||
                    av_display_rotation_set(matrix, 180.0);
 | 
			
		||||
                    av_display_matrix_flip(matrix, 1, 0);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 5:
 | 
			
		||||
                    av_display_rotation_set(matrix, 90.0);
 | 
			
		||||
                    av_display_matrix_flip(matrix, 0, 1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 6:
 | 
			
		||||
                    av_display_rotation_set(matrix, 90.0);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 7:
 | 
			
		||||
                    av_display_rotation_set(matrix, -90.0);
 | 
			
		||||
                    av_display_matrix_flip(matrix, 0, 1);
 | 
			
		||||
                    break;
 | 
			
		||||
                case 8:
 | 
			
		||||
                    av_display_rotation_set(matrix, -90.0);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    av_assert0(0);
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    av_dict_copy(&frame->metadata, s->exif_metadata, 0);
 | 
			
		||||
    av_dict_free(&s->exif_metadata);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user