mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-30 20:16:42 +08:00 
			
		
		
		
	adpcm: Clip step_index values read from the bitstream at the beginning of each frame.
Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
This commit is contained in:
		| @@ -696,7 +696,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | ||||
|         for (channel = 0; channel < avctx->channels; channel++) { | ||||
|             cs = &c->status[channel]; | ||||
|             cs->predictor  = (int16_t)bytestream_get_le16(&src); | ||||
|             cs->step_index = *src++; | ||||
|             cs->step_index = av_clip(*src++, 0, 88); | ||||
|             src++; | ||||
|             *samples++ = cs->predictor; | ||||
|         } | ||||
| @@ -719,8 +719,8 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | ||||
|  | ||||
|         c->status[0].predictor  = (int16_t)AV_RL16(src + 10); | ||||
|         c->status[1].predictor  = (int16_t)AV_RL16(src + 12); | ||||
|         c->status[0].step_index = src[14]; | ||||
|         c->status[1].step_index = src[15]; | ||||
|         c->status[0].step_index = av_clip(src[14], 0, 88); | ||||
|         c->status[1].step_index = av_clip(src[15], 0, 88); | ||||
|         /* sign extend the predictors */ | ||||
|         src += 16; | ||||
|         diff_channel = c->status[1].predictor; | ||||
| @@ -760,7 +760,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | ||||
|         for (channel = 0; channel < avctx->channels; channel++) { | ||||
|             cs = &c->status[channel]; | ||||
|             cs->predictor  = (int16_t)bytestream_get_le16(&src); | ||||
|             cs->step_index = *src++; | ||||
|             cs->step_index = av_clip(*src++, 0, 88); | ||||
|             src++; | ||||
|         } | ||||
|  | ||||
| @@ -823,7 +823,7 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | ||||
|         src += 4; // skip sample count (already read) | ||||
|  | ||||
|         for (i=0; i<=st; i++) | ||||
|             c->status[i].step_index = bytestream_get_le32(&src); | ||||
|             c->status[i].step_index = av_clip(bytestream_get_le32(&src), 0, 88); | ||||
|         for (i=0; i<=st; i++) | ||||
|             c->status[i].predictor  = bytestream_get_le32(&src); | ||||
|  | ||||
| @@ -1037,11 +1037,11 @@ static int adpcm_decode_frame(AVCodecContext *avctx, void *data, | ||||
|     case CODEC_ID_ADPCM_IMA_SMJPEG: | ||||
|         if (avctx->codec->id == CODEC_ID_ADPCM_IMA_AMV) { | ||||
|             c->status[0].predictor = sign_extend(bytestream_get_le16(&src), 16); | ||||
|             c->status[0].step_index = bytestream_get_le16(&src); | ||||
|             c->status[0].step_index = av_clip(bytestream_get_le16(&src), 0, 88); | ||||
|             src += 4; | ||||
|         } else { | ||||
|             c->status[0].predictor = sign_extend(bytestream_get_be16(&src), 16); | ||||
|             c->status[0].step_index = bytestream_get_byte(&src); | ||||
|             c->status[0].step_index = av_clip(bytestream_get_byte(&src), 0, 88); | ||||
|             src += 1; | ||||
|         } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Alex Converse
					Alex Converse