Parse dri when receiving jpg via rtp.
Based on a patch by contact at iridiummobile ru. Fixes ticket #3780.
This commit is contained in:
		
							parent
							
								
									0e70266bbf
								
							
						
					
					
						commit
						ee88a2080e
					
				@ -106,7 +106,8 @@ static void jpeg_put_marker(PutByteContext *pbc, int code)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w,
 | 
			
		||||
                              uint32_t h, const uint8_t *qtable, int nb_qtable)
 | 
			
		||||
                              uint32_t h, const uint8_t *qtable, int nb_qtable,
 | 
			
		||||
                              int dri)
 | 
			
		||||
{
 | 
			
		||||
    PutByteContext pbc;
 | 
			
		||||
    uint8_t *dht_size_ptr;
 | 
			
		||||
@ -132,6 +133,12 @@ static int jpeg_create_header(uint8_t *buf, int size, uint32_t type, uint32_t w,
 | 
			
		||||
    bytestream2_put_byte(&pbc, 0);
 | 
			
		||||
    bytestream2_put_byte(&pbc, 0);
 | 
			
		||||
 | 
			
		||||
    if (dri) {
 | 
			
		||||
        jpeg_put_marker(&pbc, DRI);
 | 
			
		||||
        bytestream2_put_be16(&pbc, 4);
 | 
			
		||||
        bytestream2_put_be16(&pbc, dri);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /* DQT */
 | 
			
		||||
    jpeg_put_marker(&pbc, DQT);
 | 
			
		||||
    bytestream2_put_be16(&pbc, 2 + nb_qtable * (1 + 64));
 | 
			
		||||
@ -226,7 +233,7 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg,
 | 
			
		||||
    const uint8_t *qtables = NULL;
 | 
			
		||||
    uint16_t qtable_len;
 | 
			
		||||
    uint32_t off;
 | 
			
		||||
    int ret;
 | 
			
		||||
    int ret, dri = 0;
 | 
			
		||||
 | 
			
		||||
    if (len < 8) {
 | 
			
		||||
        av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
 | 
			
		||||
@ -242,6 +249,16 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg,
 | 
			
		||||
    buf += 8;
 | 
			
		||||
    len -= 8;
 | 
			
		||||
 | 
			
		||||
    if (type & 0x40) {
 | 
			
		||||
        if (len < 4) {
 | 
			
		||||
            av_log(ctx, AV_LOG_ERROR, "Too short RTP/JPEG packet.\n");
 | 
			
		||||
            return AVERROR_INVALIDDATA;
 | 
			
		||||
        }
 | 
			
		||||
        dri = AV_RB16(buf);
 | 
			
		||||
        buf += 4;
 | 
			
		||||
        len -= 4;
 | 
			
		||||
        type &= ~0x40;
 | 
			
		||||
    }
 | 
			
		||||
    /* Parse the restart marker header. */
 | 
			
		||||
    if (type > 63) {
 | 
			
		||||
        av_log(ctx, AV_LOG_ERROR,
 | 
			
		||||
@ -332,7 +349,7 @@ static int jpeg_parse_packet(AVFormatContext *ctx, PayloadContext *jpeg,
 | 
			
		||||
         * interchange format. */
 | 
			
		||||
        jpeg->hdr_size = jpeg_create_header(hdr, sizeof(hdr), type, width,
 | 
			
		||||
                                            height, qtables,
 | 
			
		||||
                                            qtable_len / 64);
 | 
			
		||||
                                            qtable_len / 64, dri);
 | 
			
		||||
 | 
			
		||||
        /* Copy JPEG header to frame buffer. */
 | 
			
		||||
        avio_write(jpeg->frame, hdr, jpeg->hdr_size);
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user