mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 12:36:41 +08:00 
			
		
		
		
	sipr: decode directly to the user-provided AVFrame
This commit is contained in:
		| @@ -516,9 +516,6 @@ static av_cold int sipr_decoder_init(AVCodecContext * avctx) | |||||||
|     avctx->channel_layout = AV_CH_LAYOUT_MONO; |     avctx->channel_layout = AV_CH_LAYOUT_MONO; | ||||||
|     avctx->sample_fmt     = AV_SAMPLE_FMT_FLT; |     avctx->sample_fmt     = AV_SAMPLE_FMT_FLT; | ||||||
|  |  | ||||||
|     avcodec_get_frame_defaults(&ctx->frame); |  | ||||||
|     avctx->coded_frame = &ctx->frame; |  | ||||||
|  |  | ||||||
|     return 0; |     return 0; | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -526,6 +523,7 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *data, | |||||||
|                              int *got_frame_ptr, AVPacket *avpkt) |                              int *got_frame_ptr, AVPacket *avpkt) | ||||||
| { | { | ||||||
|     SiprContext *ctx = avctx->priv_data; |     SiprContext *ctx = avctx->priv_data; | ||||||
|  |     AVFrame *frame   = data; | ||||||
|     const uint8_t *buf=avpkt->data; |     const uint8_t *buf=avpkt->data; | ||||||
|     SiprParameters parm; |     SiprParameters parm; | ||||||
|     const SiprModeParam *mode_par = &modes[ctx->mode]; |     const SiprModeParam *mode_par = &modes[ctx->mode]; | ||||||
| @@ -543,13 +541,13 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *data, | |||||||
|     } |     } | ||||||
|  |  | ||||||
|     /* get output buffer */ |     /* get output buffer */ | ||||||
|     ctx->frame.nb_samples = mode_par->frames_per_packet * subframe_size * |     frame->nb_samples = mode_par->frames_per_packet * subframe_size * | ||||||
|                             mode_par->subframe_count; |                         mode_par->subframe_count; | ||||||
|     if ((ret = ff_get_buffer(avctx, &ctx->frame)) < 0) { |     if ((ret = ff_get_buffer(avctx, frame)) < 0) { | ||||||
|         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); |         av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); | ||||||
|         return ret; |         return ret; | ||||||
|     } |     } | ||||||
|     samples = (float *)ctx->frame.data[0]; |     samples = (float *)frame->data[0]; | ||||||
|  |  | ||||||
|     init_get_bits(&gb, buf, mode_par->bits_per_frame); |     init_get_bits(&gb, buf, mode_par->bits_per_frame); | ||||||
|  |  | ||||||
| @@ -561,8 +559,7 @@ static int sipr_decode_frame(AVCodecContext *avctx, void *data, | |||||||
|         samples += subframe_size * mode_par->subframe_count; |         samples += subframe_size * mode_par->subframe_count; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     *got_frame_ptr   = 1; |     *got_frame_ptr = 1; | ||||||
|     *(AVFrame *)data = ctx->frame; |  | ||||||
|  |  | ||||||
|     return mode_par->bits_per_frame >> 3; |     return mode_par->bits_per_frame >> 3; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -65,7 +65,6 @@ typedef struct SiprParameters { | |||||||
|  |  | ||||||
| typedef struct SiprContext { | typedef struct SiprContext { | ||||||
|     AVCodecContext *avctx; |     AVCodecContext *avctx; | ||||||
|     AVFrame frame; |  | ||||||
|  |  | ||||||
|     SiprMode mode; |     SiprMode mode; | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Justin Ruggles
					Justin Ruggles