mirror of
				https://github.com/nyanmisaka/ffmpeg-rockchip.git
				synced 2025-10-31 12:36:41 +08:00 
			
		
		
		
	fftools/ffmpeg: use a bsf list instead of individual bsfs
Signed-off-by: Marton Balint <cus@passwd.hu>
This commit is contained in:
		| @@ -558,9 +558,7 @@ static void ffmpeg_cleanup(int ret) | ||||
|         if (!ost) | ||||
|             continue; | ||||
|  | ||||
|         for (j = 0; j < ost->nb_bitstream_filters; j++) | ||||
|             av_bsf_free(&ost->bsf_ctx[j]); | ||||
|         av_freep(&ost->bsf_ctx); | ||||
|         av_bsf_free(&ost->bsf_ctx); | ||||
|  | ||||
|         av_frame_free(&ost->filtered_frame); | ||||
|         av_frame_free(&ost->last_frame); | ||||
| @@ -859,40 +857,15 @@ static void output_packet(OutputFile *of, AVPacket *pkt, | ||||
| { | ||||
|     int ret = 0; | ||||
|  | ||||
|     /* apply the output bitstream filters, if any */ | ||||
|     if (ost->nb_bitstream_filters) { | ||||
|         int idx; | ||||
|  | ||||
|         ret = av_bsf_send_packet(ost->bsf_ctx[0], eof ? NULL : pkt); | ||||
|     /* apply the output bitstream filters */ | ||||
|     if (ost->bsf_ctx) { | ||||
|         ret = av_bsf_send_packet(ost->bsf_ctx, eof ? NULL : pkt); | ||||
|         if (ret < 0) | ||||
|             goto finish; | ||||
|  | ||||
|         eof = 0; | ||||
|         idx = 1; | ||||
|         while (idx) { | ||||
|             /* get a packet from the previous filter up the chain */ | ||||
|             ret = av_bsf_receive_packet(ost->bsf_ctx[idx - 1], pkt); | ||||
|             if (ret == AVERROR(EAGAIN)) { | ||||
|                 ret = 0; | ||||
|                 idx--; | ||||
|                 continue; | ||||
|             } else if (ret == AVERROR_EOF) { | ||||
|                 eof = 1; | ||||
|             } else if (ret < 0) | ||||
|                 goto finish; | ||||
|  | ||||
|             /* send it to the next filter down the chain or to the muxer */ | ||||
|             if (idx < ost->nb_bitstream_filters) { | ||||
|                 ret = av_bsf_send_packet(ost->bsf_ctx[idx], eof ? NULL : pkt); | ||||
|                 if (ret < 0) | ||||
|                     goto finish; | ||||
|                 idx++; | ||||
|                 eof = 0; | ||||
|             } else if (eof) | ||||
|                 goto finish; | ||||
|             else | ||||
|         while ((ret = av_bsf_receive_packet(ost->bsf_ctx, pkt)) >= 0) | ||||
|             write_packet(of, pkt, ost, 0); | ||||
|         } | ||||
|         if (ret == AVERROR(EAGAIN)) | ||||
|             ret = 0; | ||||
|     } else if (!eof) | ||||
|         write_packet(of, pkt, ost, 0); | ||||
|  | ||||
| @@ -3015,35 +2988,28 @@ static int check_init_output_file(OutputFile *of, int file_index) | ||||
|  | ||||
| static int init_output_bsfs(OutputStream *ost) | ||||
| { | ||||
|     AVBSFContext *ctx; | ||||
|     int i, ret; | ||||
|     AVBSFContext *ctx = ost->bsf_ctx; | ||||
|     int ret; | ||||
|  | ||||
|     if (!ost->nb_bitstream_filters) | ||||
|     if (!ctx) | ||||
|         return 0; | ||||
|  | ||||
|     for (i = 0; i < ost->nb_bitstream_filters; i++) { | ||||
|         ctx = ost->bsf_ctx[i]; | ||||
|  | ||||
|         ret = avcodec_parameters_copy(ctx->par_in, | ||||
|                                       i ? ost->bsf_ctx[i - 1]->par_out : ost->st->codecpar); | ||||
|     ret = avcodec_parameters_copy(ctx->par_in, ost->st->codecpar); | ||||
|     if (ret < 0) | ||||
|         return ret; | ||||
|  | ||||
|         ctx->time_base_in = i ? ost->bsf_ctx[i - 1]->time_base_out : ost->st->time_base; | ||||
|     ctx->time_base_in = ost->st->time_base; | ||||
|  | ||||
|     ret = av_bsf_init(ctx); | ||||
|     if (ret < 0) { | ||||
|         av_log(NULL, AV_LOG_ERROR, "Error initializing bitstream filter: %s\n", | ||||
|                    ost->bsf_ctx[i]->filter->name); | ||||
|                ctx->filter->name); | ||||
|         return ret; | ||||
|     } | ||||
|     } | ||||
|  | ||||
|     ctx = ost->bsf_ctx[ost->nb_bitstream_filters - 1]; | ||||
|     ret = avcodec_parameters_copy(ost->st->codecpar, ctx->par_out); | ||||
|     if (ret < 0) | ||||
|         return ret; | ||||
|  | ||||
|     ost->st->time_base = ctx->time_base_out; | ||||
|  | ||||
|     return 0; | ||||
|   | ||||
| @@ -459,8 +459,7 @@ typedef struct OutputStream { | ||||
|     AVRational mux_timebase; | ||||
|     AVRational enc_timebase; | ||||
|  | ||||
|     int                    nb_bitstream_filters; | ||||
|     AVBSFContext            **bsf_ctx; | ||||
|     AVBSFContext            *bsf_ctx; | ||||
|  | ||||
|     AVCodecContext *enc_ctx; | ||||
|     AVCodecParameters *ref_par; /* associated input codec parameters with encoders options applied */ | ||||
|   | ||||
| @@ -1528,54 +1528,12 @@ static OutputStream *new_output_stream(OptionsContext *o, AVFormatContext *oc, e | ||||
|     MATCH_PER_STREAM_OPT(copy_prior_start, i, ost->copy_prior_start, oc ,st); | ||||
|  | ||||
|     MATCH_PER_STREAM_OPT(bitstream_filters, str, bsfs, oc, st); | ||||
|     while (bsfs && *bsfs) { | ||||
|         const AVBitStreamFilter *filter; | ||||
|         char *bsf, *bsf_options_str, *bsf_name; | ||||
|  | ||||
|         bsf = av_get_token(&bsfs, ","); | ||||
|         if (!bsf) | ||||
|             exit_program(1); | ||||
|         bsf_name = av_strtok(bsf, "=", &bsf_options_str); | ||||
|         if (!bsf_name) | ||||
|             exit_program(1); | ||||
|  | ||||
|         filter = av_bsf_get_by_name(bsf_name); | ||||
|         if (!filter) { | ||||
|             av_log(NULL, AV_LOG_FATAL, "Unknown bitstream filter %s\n", bsf_name); | ||||
|             exit_program(1); | ||||
|         } | ||||
|  | ||||
|         ost->bsf_ctx = av_realloc_array(ost->bsf_ctx, | ||||
|                                         ost->nb_bitstream_filters + 1, | ||||
|                                         sizeof(*ost->bsf_ctx)); | ||||
|         if (!ost->bsf_ctx) | ||||
|             exit_program(1); | ||||
|  | ||||
|         ret = av_bsf_alloc(filter, &ost->bsf_ctx[ost->nb_bitstream_filters]); | ||||
|     if (bsfs && *bsfs) { | ||||
|         ret = av_bsf_list_parse_str(bsfs, &ost->bsf_ctx); | ||||
|         if (ret < 0) { | ||||
|             av_log(NULL, AV_LOG_ERROR, "Error allocating a bitstream filter context\n"); | ||||
|             av_log(NULL, AV_LOG_ERROR, "Error parsing bitstream filter sequence '%s': %s\n", bsfs, av_err2str(ret)); | ||||
|             exit_program(1); | ||||
|         } | ||||
|  | ||||
|         ost->nb_bitstream_filters++; | ||||
|  | ||||
|         if (bsf_options_str && filter->priv_class) { | ||||
|             const AVOption *opt = av_opt_next(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, NULL); | ||||
|             const char * shorthand[2] = {NULL}; | ||||
|  | ||||
|             if (opt) | ||||
|                 shorthand[0] = opt->name; | ||||
|  | ||||
|             ret = av_opt_set_from_string(ost->bsf_ctx[ost->nb_bitstream_filters-1]->priv_data, bsf_options_str, shorthand, "=", ":"); | ||||
|             if (ret < 0) { | ||||
|                 av_log(NULL, AV_LOG_ERROR, "Error parsing options for bitstream filter %s\n", bsf_name); | ||||
|                 exit_program(1); | ||||
|             } | ||||
|         } | ||||
|         av_freep(&bsf); | ||||
|  | ||||
|         if (*bsfs) | ||||
|             bsfs++; | ||||
|     } | ||||
|  | ||||
|     MATCH_PER_STREAM_OPT(codec_tags, str, codec_tag, oc, st); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Marton Balint
					Marton Balint